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_G729Dec_Utils.c
     30  *
     31  * This file implements OMX Component for G729 decoder that
     32  * is fully compliant with the OMX Audio specification .
     33  *
     34  * @path  $(OMAPSW_MPU)\linux\audio\src\openmax_il\g729_dec\src
     35  *
     36  * @rev  0.5
     37  */
     38 /* -----------------------------------------------------------------------------
     39  *!
     40  *! Revision History
     41  *! ===================================
     42  *! Date         Author(s)            Version  Description
     43  *! ---------    -------------------  -------  ---------------------------------
     44  *! 03-Jan-2007  A.Donjon                         0.1      Code update for G729 DECODER
     45  *! 16-Feb-2007  A.Donjon                         0.2      Frame Lost
     46  *!                                                                                        Input buffer size used for buffer check in SN
     47  *! 01-Mar-2007  A.Donjon                         0.3      RM, DVFS changes
     48  *! 08-Jun-2007  A.Donjon                         0.4      Variable input buffer size
     49  *! 04-Jul-2007  A.Donjon                         0.5      Last output frame reset for repeated play wo deleting component
     50  *!
     51  *!
     52  * ================================================================================= */
     53 
     54 /* ------compilation control switches -------------------------*/
     55 
     56 /****************************************************************
     57  *  INCLUDE FILES
     58  ****************************************************************/
     59 /* ----- system and platform files ----------------------------*/
     60 #ifdef UNDER_CE
     61 #include <windows.h>
     62 #include <oaf_osal.h>
     63 #include <omx_core.h>
     64 #include <stdlib.h>
     65 #else
     66 #include <unistd.h>
     67 #include <sys/types.h>
     68 #include <sys/types.h>
     69 #include <sys/stat.h>
     70 #include <dlfcn.h>
     71 #include <malloc.h>
     72 #include <memory.h>
     73 #include <fcntl.h>
     74 #include <errno.h>
     75 #include <dlfcn.h>
     76 #endif
     77 #include <dbapi.h>
     78 #include <string.h>
     79 #include <stdio.h>
     80 /*-------program files ----------------------------------------*/
     81 #include "OMX_G729Decoder.h"
     82 #include "OMX_G729Dec_Utils.h"
     83 #include "g729decsocket_ti.h"
     84 #include "decode_common_ti.h"
     85 #include "OMX_G729Dec_ComponentThread.h"
     86 #include "usn.h"
     87 #ifdef __PERF_INSTRUMENTATION__
     88 #include "perf.h"
     89 #endif
     90 
     91 /* ======================================================================= */
     92 /**
     93  * @def    DASF    Defines the value for identify DASF ON
     94  */
     95 /* ======================================================================= */
     96 #define DASF 1
     97 
     98 #ifdef UNDER_CE
     99 #define HASHINGENABLE 1
    100 HINSTANCE g_hLcmlDllHandle = NULL;
    101 
    102 #endif
    103 
    104 static G729DEC_COMPONENT_PRIVATE *pComponentPrivate_CC;
    105 /* ========================================================================== */
    106 /**
    107  * @G729DECFill_LCMLInitParams () This function is used by the component thread to
    108  * fill the all of its initialization parameters, buffer deatils  etc
    109  * to LCML structure,
    110  *
    111  * @param pComponent  handle for this instance of the component
    112  * @param plcml_Init  pointer to LCML structure to be filled
    113  *
    114  * @pre
    115  *
    116  * @post
    117  *
    118  * @return none
    119  */
    120 /* ========================================================================== */
    121 
    122 OMX_ERRORTYPE G729DECFill_LCMLInitParams(OMX_HANDLETYPE pComponent,
    123                                          LCML_DSP *plcml_Init, OMX_U16 arr[])
    124 {
    125 
    126     OMX_ERRORTYPE eError = OMX_ErrorNone;
    127     OMX_U32 nIpBuf=0,nIpBufSize=0,nOpBuf=0,nOpBufSize=0;
    128     OMX_U32 i=0;
    129     OMX_BUFFERHEADERTYPE *pTemp = NULL;
    130     OMX_S16 size_lcml=0;
    131     LCML_STRMATTR *strmAttr = NULL;
    132 
    133     LCML_DSP_INTERFACE *pHandle = (LCML_DSP_INTERFACE *)pComponent;
    134     G729DEC_COMPONENT_PRIVATE *pComponentPrivate = NULL;
    135     LCML_G729DEC_BUFHEADERTYPE *pTemp_lcml = NULL;
    136 
    137     G729DEC_DPRINT("%d :: G729DECFill_LCMLInitParams\n ",__LINE__);
    138     G729DEC_DPRINT("%d :: pHandle = %p\n",__LINE__,pHandle);
    139     G729DEC_DPRINT("%d :: pHandle->pComponentPrivate = %p\n",__LINE__,pHandle->pComponentPrivate);
    140     pComponentPrivate = pHandle->pComponentPrivate;
    141 
    142     pComponentPrivate->bufParamsArray = malloc((10 * sizeof(unsigned long int)) + 256);
    143     pComponentPrivate->bufParamsArray += 128;
    144     memset(pComponentPrivate->bufParamsArray, 0, 9 * sizeof(unsigned long int));
    145     nIpBuf = pComponentPrivate->pInputBufferList->numBuffers;
    146     pComponentPrivate->nRuntimeInputBuffers = nIpBuf;
    147     nOpBuf = pComponentPrivate->pOutputBufferList->numBuffers;
    148     pComponentPrivate->nRuntimeOutputBuffers = nOpBuf;
    149     nIpBufSize = pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->nBufferSize;
    150     nOpBuf = pComponentPrivate->pOutputBufferList->numBuffers;
    151     nOpBufSize = pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->nBufferSize;
    152 
    153     G729DEC_DPRINT("------ Buffer Details -----------\n");
    154     G729DEC_DPRINT("Input  Buffer Count = %ld\n", nIpBuf);
    155     G729DEC_DPRINT("Input  Buffer Size = %ld\n", nIpBufSize);
    156     G729DEC_DPRINT("Output Buffer Count = %ld\n", nOpBuf);
    157     G729DEC_DPRINT("Output Buffer Size = %ld\n", nOpBufSize);
    158     G729DEC_DPRINT("------ Buffer Details ------------\n");
    159 
    160     /* Fill Input Buffers Info for LCML */
    161     plcml_Init->In_BufInfo.nBuffers = nIpBuf;
    162     plcml_Init->In_BufInfo.nSize = nIpBufSize;
    163     plcml_Init->In_BufInfo.DataTrMethod = DMM_METHOD;
    164 
    165 
    166     /* Fill Output Buffers Info for LCML */
    167     plcml_Init->Out_BufInfo.nBuffers = nOpBuf;
    168     plcml_Init->Out_BufInfo.nSize = nOpBufSize;
    169     plcml_Init->Out_BufInfo.DataTrMethod = DMM_METHOD;
    170 
    171     /*Copy the node information */
    172     plcml_Init->NodeInfo.nNumOfDLLs = 3;
    173 
    174     plcml_Init->NodeInfo.AllUUIDs[0].uuid = &G729DECSOCKET_TI_UUID;
    175     strcpy ((char *)plcml_Init->NodeInfo.AllUUIDs[0].DllName,G729DEC_DLL_NAME);
    176     plcml_Init->NodeInfo.AllUUIDs[0].eDllType = DLL_NODEOBJECT;
    177 
    178     plcml_Init->NodeInfo.AllUUIDs[1].uuid = &G729DECSOCKET_TI_UUID;
    179     strcpy ((char *)plcml_Init->NodeInfo.AllUUIDs[1].DllName,G729DEC_DLL_NAME);
    180     plcml_Init->NodeInfo.AllUUIDs[1].eDllType = DLL_DEPENDENT;
    181 
    182     plcml_Init->NodeInfo.AllUUIDs[2].uuid = &DECODE_COMMON_TI_UUID;
    183     strcpy ((char *)plcml_Init->NodeInfo.AllUUIDs[2].DllName,G729DEC_USN_DLL_NAME);
    184     plcml_Init->NodeInfo.AllUUIDs[2].eDllType = DLL_DEPENDENT;
    185 
    186 
    187     if(pComponentPrivate->dasfmode == 1) {
    188         G729DEC_DPRINT("pComponentPrivate->dasfmode = %d\n",pComponentPrivate->dasfmode);
    189         OMX_G729MALLOC_STRUCT(strmAttr, LCML_STRMATTR);
    190 
    191         pComponentPrivate->strmAttr = strmAttr;
    192         G729DEC_MEMPRINT("%d:[ALLOC] %p\n",__LINE__,strmAttr);
    193 
    194         strmAttr->uSegid = 0;
    195         strmAttr->uAlignment = 0;
    196         strmAttr->uTimeout = G729D_TIMEOUT;
    197         strmAttr->uBufsize = nOpBufSize;
    198         strmAttr->uNumBufs = 2;
    199         strmAttr->lMode = STRMMODE_PROCCOPY;
    200         plcml_Init->DeviceInfo.TypeofDevice =1;
    201         plcml_Init->DeviceInfo.TypeofRender =0;
    202         if(pComponentPrivate->acdnmode == 1)
    203         {
    204             /* DASF/TeeDN mode */
    205             plcml_Init->DeviceInfo.AllUUIDs[0].uuid = &ACDN_TI_UUID;
    206         }
    207         else
    208         {
    209             /* ACDN mode */
    210             plcml_Init->DeviceInfo.AllUUIDs[0].uuid = &DCTN_TI_UUID;
    211         }
    212         plcml_Init->DeviceInfo.DspStream = strmAttr;
    213     }
    214     else {
    215         pComponentPrivate->strmAttr = NULL;
    216     }
    217 
    218 
    219     /*copy the other information */
    220     plcml_Init->SegID = OMX_G729DEC_DEFAULT_SEGMENT;
    221     plcml_Init->Timeout = OMX_G729DEC_SN_TIMEOUT;
    222     plcml_Init->Alignment = 0;
    223     plcml_Init->Priority = OMX_G729DEC_SN_PRIORITY;
    224     plcml_Init->ProfileID = -1;
    225 
    226 
    227     /* TODO: Set this using SetParameter() */
    228     pComponentPrivate->iG729SamplingFrequeny = G729DEC_SAMPLING_FREQUENCY;
    229 
    230     /*Accessing these 2 has the problem/creates problem in state transition tests*/
    231     pComponentPrivate->iG729Channels =
    232         (OMX_U16)pComponentPrivate->pcmParams->nChannels;
    233 
    234     /* Set G729 SN create phase arguments */
    235 
    236     arr[0] = STREAM_COUNT;
    237     arr[1] = G729DEC_INPUT_PORT;
    238     arr[2] = G729DEC_DMM;
    239     if (pComponentPrivate->pInputBufferList->numBuffers) {
    240         arr[3] = (OMX_U16)pComponentPrivate->pInputBufferList->numBuffers;
    241 
    242     }
    243     else {
    244         arr[3] = 1;
    245     }
    246 
    247     arr[4] = G729DEC_OUTPUT_PORT;
    248 
    249     if(pComponentPrivate->dasfmode == 1) {
    250         G729DEC_DPRINT("Setting up create phase params for DASF mode\n");
    251         arr[5] = G729DEC_OUTSTRM;
    252         arr[6] = NUM_G729DEC_OUTPUT_BUFFERS_DASF;
    253     }
    254     else {
    255 
    256         G729DEC_DPRINT("Setting up create phase params for FILE mode\n");
    257         arr[5] = G729DEC_DMM;
    258         if (pComponentPrivate->pOutputBufferList->numBuffers) {
    259             arr[6] = (OMX_U16)pComponentPrivate->pOutputBufferList->numBuffers;
    260         }
    261         else {
    262             arr[6] = 1;
    263         }
    264 
    265     }
    266 
    267     arr[7] = END_OF_CR_PHASE_ARGS;
    268     plcml_Init->pCrPhArgs = arr;
    269     size_lcml = (OMX_U16)(nIpBuf * sizeof(LCML_G729DEC_BUFHEADERTYPE));
    270     pTemp_lcml = (LCML_G729DEC_BUFHEADERTYPE *)malloc(size_lcml);
    271     G729DEC_MEMPRINT("%d:[ALLOC] %p\n",__LINE__,pTemp_lcml);
    272     if(pTemp_lcml == NULL) {
    273         G729DEC_DPRINT("%d :: Memory Allocation Failed\n",__LINE__);
    274         /* Free previously allocated memory before bailing */
    275         if (strmAttr) {
    276             free(strmAttr);
    277             strmAttr = NULL;
    278         }
    279         eError = OMX_ErrorInsufficientResources;
    280         goto EXIT;
    281     }
    282     pComponentPrivate->pLcmlBufHeader[G729DEC_INPUT_PORT] = pTemp_lcml;
    283 
    284     for (i=0; i<nIpBuf; i++) {
    285         pTemp = pComponentPrivate->pInputBufferList->pBufHdr[i];
    286         pTemp->nSize = sizeof(OMX_BUFFERHEADERTYPE);
    287         pTemp->nAllocLen = nIpBufSize;
    288         pTemp->nFilledLen = nIpBufSize;
    289         pTemp->nVersion.s.nVersionMajor = G729DEC_MAJOR_VER;
    290         pTemp->nVersion.s.nVersionMinor = G729DEC_MINOR_VER;
    291         pTemp->pPlatformPrivate = pHandle->pComponentPrivate;
    292         pTemp_lcml->buffer = pTemp;
    293         pTemp_lcml->eDir = OMX_DirInput;
    294         OMX_G729MALLOC_STRUCT(pTemp_lcml->pIpParam, G729DEC_UAlgBufParamStruct);
    295         pTemp_lcml->pIpParam->usFrameLost = 0;
    296         pTemp_lcml->pIpParam->usLastFrame = 0;
    297         /* This means, it is not a last buffer. This flag is to be modified by
    298          * the application to indicate the last buffer */
    299         pTemp->nFlags = NORMAL_BUFFER;
    300         pTemp++;
    301         pTemp_lcml++;
    302     }
    303 
    304     /* Allocate memory for all output buffer headers..
    305      * This memory pointer will be sent to LCML */
    306     size_lcml = (OMX_U16)(nOpBuf * sizeof(LCML_G729DEC_BUFHEADERTYPE));
    307     pTemp_lcml = (LCML_G729DEC_BUFHEADERTYPE *)malloc(size_lcml);
    308     G729DEC_MEMPRINT("%d:[ALLOC] %p\n",__LINE__,pTemp_lcml);
    309     if(pTemp_lcml == NULL) {
    310         /* Free previously allocated memory before bailing */
    311         if (strmAttr) {
    312             free(strmAttr);
    313             strmAttr = NULL;
    314         }
    315         eError = OMX_ErrorInsufficientResources;
    316         goto EXIT;
    317     }
    318     memset(pTemp_lcml, 0x0, size_lcml);
    319     pComponentPrivate->pLcmlBufHeader[G729DEC_OUTPUT_PORT] = pTemp_lcml;
    320 
    321     for (i=0; i<nOpBuf; i++) {
    322         pTemp = pComponentPrivate->pOutputBufferList->pBufHdr[i];
    323         pTemp->nSize = (OMX_U16)sizeof(OMX_BUFFERHEADERTYPE);
    324         pTemp->nAllocLen = nOpBufSize;
    325         pTemp->nFilledLen = nOpBufSize;
    326         pTemp->nVersion.s.nVersionMajor = G729DEC_MAJOR_VER;
    327         pTemp->nVersion.s.nVersionMinor = G729DEC_MINOR_VER;
    328         pComponentPrivate->nVersion = pTemp->nVersion.nVersion;
    329         pTemp->pPlatformPrivate = pHandle->pComponentPrivate;
    330         pTemp->nTickCount = 0;
    331         pTemp->nTimeStamp = 0;
    332         /* This means, it is not a last buffer. This flag is to be modified by
    333          * the application to indicate the last buffer */
    334         pTemp_lcml->buffer = pTemp;
    335         pTemp_lcml->eDir = OMX_DirOutput;
    336         OMX_G729MALLOC_STRUCT(pTemp_lcml->pIpParam, G729DEC_UAlgBufParamStruct);
    337         pTemp_lcml->pIpParam->usFrameLost = 0;
    338         pTemp_lcml->pIpParam->usLastFrame = 0;
    339         pTemp->nFlags = NORMAL_BUFFER;
    340         pTemp++;
    341         pTemp_lcml++;
    342     }
    343 #ifdef __PERF_INSTRUMENTATION__
    344     pComponentPrivate->nLcml_nCntIp = 0;
    345     pComponentPrivate->nLcml_nCntOpReceived = 0;
    346 #endif
    347     pComponentPrivate->bPortDefsAllocated = 1;
    348     pComponentPrivate->bInitParamsInitialized = 1;
    349 
    350 
    351  EXIT:
    352     G729DEC_DPRINT("%d :: Exiting G729DECFill_LCMLInitParams",__LINE__);
    353     return eError;
    354 }
    355 
    356 
    357 /* ========================================================================== */
    358 /**
    359  * @G729DEC_StartComponentThread() This function is called by the component to create
    360  * the component thread, command pipe and data pipe.
    361  *
    362  * @param pComponent  handle for this instance of the component
    363  *
    364  * @pre
    365  *
    366  * @post
    367  *
    368  * @return none
    369  */
    370 /* ========================================================================== */
    371 
    372 
    373 
    374 OMX_ERRORTYPE G729DEC_StartComponentThread(OMX_HANDLETYPE pComponent)
    375 {
    376     OMX_ERRORTYPE eError = OMX_ErrorNone;
    377     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent;
    378     G729DEC_COMPONENT_PRIVATE *pComponentPrivate =
    379         (G729DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
    380 #ifdef UNDER_CE
    381     pthread_attr_t attr;
    382     memset(&attr, 0, sizeof(attr));
    383     attr.__inheritsched = PTHREAD_EXPLICIT_SCHED;
    384     attr.__schedparam.__sched_priority = OMX_AUDIO_DECODER_THREAD_PRIORITY;
    385 #endif
    386     G729DEC_DPRINT ("%d :: Inside  G729DEC_StartComponentThread\n", __LINE__);
    387 
    388     /* Initialize all the variables*/
    389     pComponentPrivate->bIsStopping = 0;
    390     pComponentPrivate->bCompThreadStop = 0;
    391     pComponentPrivate->lcml_nOpBuf = 0;
    392     pComponentPrivate->lcml_nIpBuf = 0;
    393     pComponentPrivate->app_nBuf = 0;
    394     pComponentPrivate->num_Op_Issued = 0;
    395     pComponentPrivate->num_Sent_Ip_Buff = 0;
    396     pComponentPrivate->num_Reclaimed_Op_Buff = 0;
    397     pComponentPrivate->bIsEOFSent = 0;
    398 
    399     /* create the pipe used to send buffers to the thread */
    400     eError = pipe (pComponentPrivate->cmdDataPipe);
    401     if (eError) {
    402         eError = OMX_ErrorInsufficientResources;
    403         goto EXIT;
    404     }
    405 
    406     /* create the pipe used to send buffers to the thread */
    407     eError = pipe (pComponentPrivate->dataPipe);
    408     if (eError) {
    409         eError = OMX_ErrorInsufficientResources;
    410         goto EXIT;
    411     }
    412 
    413     /* create the pipe used to send commands to the thread */
    414     eError = pipe (pComponentPrivate->cmdPipe);
    415     if (eError) {
    416         eError = OMX_ErrorInsufficientResources;
    417         goto EXIT;
    418     }
    419 
    420     /* Create the Component Thread */
    421 #ifdef UNDER_CE
    422     eError = pthread_create (&(pComponentPrivate->ComponentThread), &attr,
    423                              G729DEC_ComponentThread, pComponentPrivate);
    424 #else
    425     eError = pthread_create (&(pComponentPrivate->ComponentThread), NULL,
    426                              G729DEC_ComponentThread, pComponentPrivate);
    427 #endif
    428     if (eError || !pComponentPrivate->ComponentThread) {
    429         eError = OMX_ErrorInsufficientResources;
    430         goto EXIT;
    431     }
    432     pComponentPrivate_CC = pComponentPrivate;
    433 
    434     pComponentPrivate->bCompThreadStarted = 1;
    435  EXIT:
    436     return eError;
    437 }
    438 
    439 /* ========================================================================== */
    440 /**
    441  * @G729DEC_FreeCompResources() This function is called by the component during
    442  * de-init to close component thread, Command pipe, data pipe & LCML pipe.
    443  *
    444  * @param pComponent  handle for this instance of the component
    445  *
    446  * @pre
    447  *
    448  * @post
    449  *
    450  * @return none
    451  */
    452 /* ========================================================================== */
    453 
    454 OMX_ERRORTYPE G729DEC_FreeCompResources(OMX_HANDLETYPE pComponent)
    455 {
    456     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent;
    457     G729DEC_COMPONENT_PRIVATE *pComponentPrivate = (G729DEC_COMPONENT_PRIVATE *)
    458         pHandle->pComponentPrivate;
    459 
    460     OMX_ERRORTYPE eError = OMX_ErrorNone;
    461     OMX_ERRORTYPE err = OMX_ErrorNone;
    462     OMX_U32 nIpBuf = 0;
    463     OMX_U32 nOpBuf = 0;
    464 
    465     G729DEC_DPRINT ("%d :: G729DEC_FreeCompResources\n", __LINE__);
    466 
    467     if (pComponentPrivate->bPortDefsAllocated) {
    468         nIpBuf = pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->nBufferCountActual;
    469         nOpBuf = pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->nBufferCountActual;
    470     }
    471 
    472     if (pComponentPrivate->bCompThreadStarted) {
    473         err = close (pComponentPrivate->dataPipe[0]);
    474 
    475         if (0 != err && OMX_ErrorNone == eError) {
    476             eError = OMX_ErrorHardware;
    477         }
    478 
    479         err = close (pComponentPrivate->dataPipe[1]);
    480         if (0 != err && OMX_ErrorNone == eError) {
    481             eError = OMX_ErrorHardware;
    482         }
    483 
    484         err = close (pComponentPrivate->cmdPipe[0]);
    485         if (0 != err && OMX_ErrorNone == eError) {
    486             eError = OMX_ErrorHardware;
    487         }
    488 
    489         err = close (pComponentPrivate->cmdPipe[1]);
    490         if (0 != err && OMX_ErrorNone == eError) {
    491             eError = OMX_ErrorHardware;
    492         }
    493 
    494         err = close (pComponentPrivate->cmdDataPipe[0]);
    495         if (0 != err && OMX_ErrorNone == eError) {
    496             eError = OMX_ErrorHardware;
    497         }
    498 
    499         err = close (pComponentPrivate->cmdDataPipe[1]);
    500         if (0 != err && OMX_ErrorNone == eError) {
    501             eError = OMX_ErrorHardware;
    502         }
    503 
    504     }
    505 
    506     if (pComponentPrivate->bPortDefsAllocated) {
    507         if (pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]) {
    508             G729DEC_MEMPRINT("%d:[FREE] %p\n",__LINE__,pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]);
    509             free(pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]);
    510             pComponentPrivate->pPortDef[G729DEC_INPUT_PORT] = NULL;
    511         }
    512         pComponentPrivate->pPortDef[G729DEC_INPUT_PORT] = NULL;
    513 
    514         if (pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]) {
    515             G729DEC_MEMPRINT("%d:[FREE] %p\n",__LINE__,pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]);
    516             free (pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]);
    517             pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT] = NULL;
    518         }
    519         pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT] = NULL;
    520 
    521         if (pComponentPrivate->g729Params) {
    522             G729DEC_MEMPRINT("%d:[FREE] %p\n",__LINE__,pComponentPrivate->g729Params);
    523             free(pComponentPrivate->g729Params);
    524             pComponentPrivate->g729Params = NULL;
    525         }
    526 
    527         if (pComponentPrivate->pcmParams) {
    528             G729DEC_MEMPRINT("%d:[FREE] %p\n",__LINE__,pComponentPrivate->pcmParams);
    529             free (pComponentPrivate->pcmParams);
    530             pComponentPrivate->pcmParams = NULL;
    531         }
    532     }
    533     pComponentPrivate->bPortDefsAllocated = 0;
    534     return eError;
    535 }
    536 
    537 
    538 
    539 OMX_ERRORTYPE G729DEC_CleanupInitParams(OMX_HANDLETYPE pComponent)
    540 {
    541     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent;
    542     G729DEC_COMPONENT_PRIVATE *pComponentPrivate = (G729DEC_COMPONENT_PRIVATE *)
    543         pHandle->pComponentPrivate;
    544 
    545     LCML_G729DEC_BUFHEADERTYPE *pTemp_lcml = NULL;
    546 
    547     OMX_ERRORTYPE eError = OMX_ErrorNone;
    548     OMX_U32 nIpBuf = 0;
    549     OMX_U32 nOpBuf = 0;
    550     OMX_U32 i=0;
    551 
    552     G729DEC_DPRINT ("%d :: G729DEC_CleanupInitParams()\n", __LINE__);
    553 
    554     if (pComponentPrivate->strmAttr) {
    555         free(pComponentPrivate->strmAttr);
    556         pComponentPrivate->strmAttr = NULL;
    557     }
    558     if(pComponentPrivate->pParams!=NULL){
    559         free(pComponentPrivate->pParams);
    560         pComponentPrivate->pParams = NULL;
    561     }
    562 
    563     nIpBuf = pComponentPrivate->nRuntimeInputBuffers;
    564     pTemp_lcml = pComponentPrivate->pLcmlBufHeader[G729DEC_INPUT_PORT];
    565 
    566     for(i=0; i<nIpBuf; i++) {
    567         G729DEC_MEMPRINT("%d:[FREE] %p\n",__LINE__,pTemp_lcml->pIpParam);
    568         free(pTemp_lcml->pIpParam);
    569         pTemp_lcml->pIpParam = NULL;
    570         pTemp_lcml++;
    571     }
    572 
    573 
    574     nOpBuf = pComponentPrivate->nRuntimeOutputBuffers;
    575     pTemp_lcml = pComponentPrivate->pLcmlBufHeader[G729DEC_OUTPUT_PORT];
    576     for(i=0; i<nOpBuf; i++) {
    577         G729DEC_MEMPRINT("%d:[FREE] %p\n",__LINE__,pTemp_lcml->pIpParam);
    578         free(pTemp_lcml->pIpParam);
    579         pTemp_lcml->pIpParam = NULL;
    580         pTemp_lcml++;
    581     }
    582 
    583     if(pComponentPrivate->bufParamsArray != NULL){
    584         pComponentPrivate->bufParamsArray -= 128;
    585         free(pComponentPrivate->bufParamsArray);
    586         pComponentPrivate->bufParamsArray = NULL;
    587     }
    588     G729DEC_MEMPRINT("%d:[FREE] %p\n",__LINE__,pComponentPrivate->pLcmlBufHeader[G729DEC_INPUT_PORT]);
    589     free(pComponentPrivate->pLcmlBufHeader[G729DEC_INPUT_PORT]);
    590     pComponentPrivate->pLcmlBufHeader[G729DEC_INPUT_PORT] = NULL;
    591 
    592     G729DEC_MEMPRINT("%d:[FREE] %p\n",__LINE__,pComponentPrivate->pLcmlBufHeader[G729DEC_OUTPUT_PORT]);
    593     free(pComponentPrivate->pLcmlBufHeader[G729DEC_OUTPUT_PORT]);
    594     pComponentPrivate->pLcmlBufHeader[G729DEC_OUTPUT_PORT] = NULL;
    595     return eError;
    596 }
    597 
    598 /* ========================================================================== */
    599 /**
    600  * @G729DEC_StopComponentThread() This function is called by the component during
    601  * de-init to close component thread, Command pipe, data pipe & LCML pipe.
    602  *
    603  * @param pComponent  handle for this instance of the component
    604  *
    605  * @pre
    606  *
    607  * @post
    608  *
    609  * @return none
    610  */
    611 /* ========================================================================== */
    612 
    613 OMX_ERRORTYPE G729DEC_StopComponentThread(OMX_HANDLETYPE pComponent)
    614 {
    615     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent;
    616     G729DEC_COMPONENT_PRIVATE *pComponentPrivate = (G729DEC_COMPONENT_PRIVATE *)
    617         pHandle->pComponentPrivate;
    618 
    619     OMX_ERRORTYPE eError = OMX_ErrorNone;
    620     OMX_ERRORTYPE threadError = OMX_ErrorNone;
    621     OMX_S16 pthreadError = 0;
    622 
    623     /*Join the component thread */
    624     pComponentPrivate->bIsStopping = 1;
    625     pComponentPrivate->bCompThreadStop = 1;
    626     pthreadError = pthread_join (pComponentPrivate->ComponentThread,
    627                                  (void*)&threadError);
    628     if (0 != pthreadError) {
    629         eError = OMX_ErrorHardware;
    630     }
    631 
    632     /*Check for the errors */
    633     if (OMX_ErrorNone != threadError && OMX_ErrorNone != eError) {
    634         eError = OMX_ErrorInsufficientResources;
    635         G729DEC_DPRINT ("%d :: Error while closing Component Thread\n",__LINE__);
    636     }
    637     return eError;
    638 }
    639 
    640 
    641 /* ========================================================================== */
    642 /**
    643  * @G729DECHandleCommand() This function is called by the component when ever it
    644  * receives the command from the application
    645  *
    646  * @param pComponentPrivate  Component private data
    647  *
    648  * @pre
    649  *
    650  * @post
    651  *
    652  * @return none
    653  */
    654 /* ========================================================================== */
    655 
    656 OMX_U32 G729DECHandleCommand (G729DEC_COMPONENT_PRIVATE *pComponentPrivate)
    657 {
    658 
    659     OMX_COMPONENTTYPE *pHandle = NULL;
    660     OMX_COMMANDTYPE command;
    661     OMX_STATETYPE commandedState = OMX_StateInvalid;
    662     OMX_U32 commandData  = 0;
    663     OMX_HANDLETYPE pLcmlHandle = pComponentPrivate->pLcmlHandle;
    664     OMX_ERRORTYPE rm_error = OMX_ErrorNone;
    665     OMX_U16 i = 0;
    666     OMX_ERRORTYPE eError = OMX_ErrorNone;
    667     OMX_U32 nBuf = 0;
    668     OMX_U16 arr[100] = {0};
    669     OMX_S8 *p = (OMX_S8 *)"hello";
    670     LCML_CALLBACKTYPE cb;
    671     LCML_DSP *pLcmlDsp = NULL;
    672     G729DEC_AudioCodecParams *pParams = NULL;
    673     OMX_S16 ret = 0;
    674     LCML_G729DEC_BUFHEADERTYPE *pLcmlHdr = NULL;
    675     int inputPortFlag=0,outputPortFlag=0;
    676     OMX_U8 frameType = 0;
    677     OMX_U32 nOpBuf = 0;
    678 
    679     G729DEC_DPRINT ("%d :: Entering G729DECHandleCommand Function\n", __LINE__);
    680 
    681     pHandle = (OMX_COMPONENTTYPE *) pComponentPrivate->pHandle;
    682     G729DEC_DPRINT("pComponentPrivate->pHandle = %p at HandleCommand\n", pComponentPrivate->pHandle);
    683 
    684     ret = (OMX_U16)(read (pComponentPrivate->cmdPipe[0], &command, sizeof (command)));
    685     if (ret == -1) {
    686         G729DEC_EPRINT ("%d :: Error While reading from the Pipe\n",__LINE__);
    687         eError = OMX_ErrorHardware;
    688         goto EXIT;
    689     }
    690 
    691     ret = (OMX_U16)(read (pComponentPrivate->cmdDataPipe[0], &commandData, sizeof (commandData)));
    692     if (ret == -1) {
    693         G729DEC_EPRINT ("%d :: Error While reading from the Pipe\n",__LINE__);
    694         eError = OMX_ErrorHardware;
    695         goto EXIT;
    696     }
    697 
    698 #ifdef __PERF_INSTRUMENTATION__
    699     PERF_ReceivedCommand(pComponentPrivate->pPERFcomp, command, commandData,
    700                          PERF_ModuleLLMM);
    701 #endif
    702 
    703     if (command == OMX_CommandStateSet) {
    704         commandedState = (OMX_STATETYPE)commandData;
    705         if (pComponentPrivate->curState == commandedState){
    706             pComponentPrivate->cbInfo.EventHandler (
    707                                                     pHandle, pHandle->pApplicationPrivate,
    708                                                     OMX_EventError, OMX_ErrorSameState,0,
    709                                                     NULL);
    710             goto EXIT;
    711         }
    712 
    713         switch(commandedState) {
    714         case OMX_StateIdle:
    715 
    716 #ifdef __PERF_INSTRUMENTATION__
    717             PERF_Boundary(pComponentPrivate->pPERFcomp,
    718                           PERF_BoundaryStart | PERF_BoundarySetup);
    719 #endif
    720             if (pComponentPrivate->curState == OMX_StateLoaded || pComponentPrivate->curState == OMX_StateWaitForResources) {
    721 
    722                 if (pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->bPopulated &&
    723                     pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->bEnabled)  {
    724                     inputPortFlag = 1;
    725                 }
    726                 if (!pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->bPopulated &&
    727                     !pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->bEnabled) {
    728                     inputPortFlag = 1;
    729                 }
    730                 if (pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->bPopulated &&
    731                     pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->bEnabled) {
    732                     outputPortFlag = 1;
    733                 }
    734                 if (!pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->bPopulated &&
    735                     !pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->bEnabled) {
    736                     outputPortFlag = 1;
    737                 }
    738                 if (!(inputPortFlag && outputPortFlag)) {
    739                     pComponentPrivate->InLoaded_readytoidle = 1;
    740 
    741 #ifndef UNDER_CE
    742                     pthread_mutex_lock(&pComponentPrivate->InLoaded_mutex);
    743                     pthread_cond_wait(&pComponentPrivate->InLoaded_threshold, &pComponentPrivate->InLoaded_mutex);
    744                     pthread_mutex_unlock(&pComponentPrivate->InLoaded_mutex);
    745 #else
    746                     OMX_WaitForEvent(&(pComponentPrivate->InLoaded_event));
    747 #endif
    748                 }
    749 
    750                 G729DEC_DPRINT ("%d :: Inside G729DECHandleCommand\n",__LINE__);
    751                 cb.LCML_Callback = (void *) G729DECLCML_Callback;
    752                 pLcmlHandle = (OMX_HANDLETYPE) G729DECGetLCMLHandle(pComponentPrivate);
    753                 if (pLcmlHandle == NULL) {
    754                     G729DEC_DPRINT("%d :: LCML Handle is NULL........exiting..\n",__LINE__);
    755                     goto EXIT;
    756                 }
    757                 G729DEC_DPRINT("G729DECHandleCommand %d\n",__LINE__);
    758                 G729DEC_DPRINT("pLcmlHandle = %p\n",pLcmlHandle);
    759 
    760                 /* Got handle of dsp via phandle filling information about DSP
    761                    specific things */
    762                 pLcmlDsp = (((LCML_DSP_INTERFACE*)pLcmlHandle)->dspCodec);
    763                 G729DEC_DPRINT("pLcmlDsp = %p\n",pLcmlDsp);
    764                 eError = G729DECFill_LCMLInitParams(pHandle, pLcmlDsp, arr);
    765                 if(eError != OMX_ErrorNone) {
    766                     G729DEC_DPRINT("%d :: Error returned from\
    767                                                             G729DECFill_LCMLInitParams()\n",__LINE__);
    768                     goto EXIT;
    769                 }
    770                 G729DEC_DPRINT("%d :: Comp: OMX_G729DecUtils.c\n",__LINE__);
    771                 pComponentPrivate->pLcmlHandle = (LCML_DSP_INTERFACE *)pLcmlHandle;
    772                 /*filling create phase params */
    773                 /*         cb.LCML_Callback = (void *) G729DECLCML_Callback;
    774                            G729DEC_DPRINT("%d :: Calling LCML_InitMMCodec...\n",__LINE__); */
    775 
    776 #ifndef UNDER_CE
    777                 /* TeeDN will be default for decoder component */
    778                 G729DEC_DPRINT("G729 decoder support TeeDN\n");
    779                 eError = LCML_InitMMCodecEx(((LCML_DSP_INTERFACE *)pLcmlHandle)->pCodecinterfacehandle,
    780                                             (void *)p,&pLcmlHandle,(void *)p,&cb, (OMX_STRING)pComponentPrivate->sDeviceString);
    781 #else
    782                 eError = LCML_InitMMCodec(((LCML_DSP_INTERFACE *)pLcmlHandle)->pCodecinterfacehandle,
    783                                           (void *)p,&pLcmlHandle,(void *)p,&cb);
    784 #endif
    785                 if(eError != OMX_ErrorNone) {
    786                     G729DEC_EPRINT("%d :: Error returned from LCML_Init()\n",__LINE__);
    787                     goto EXIT;
    788                 }
    789 #ifdef HASHINGENABLE
    790                 /* Enable the Hashing Code */
    791                 eError = LCML_SetHashingState(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle, OMX_TRUE);
    792                 if (eError != OMX_ErrorNone) {
    793                     G729DEC_DPRINT("Failed to set Mapping State\n");
    794                     goto EXIT;
    795                 }
    796 #endif
    797 
    798 
    799 
    800 #ifdef RESOURCE_MANAGER_ENABLED
    801                 /* need check the resource with RM */
    802                 pComponentPrivate->rmproxyCallback.RMPROXY_Callback = (void *) G729DEC_ResourceManagerCallback;
    803                 rm_error = RMProxy_NewSendCommand(pHandle,
    804                                                   RMProxy_RequestResource,
    805                                                   OMX_G729_Decoder_COMPONENT,
    806                                                   G729DEC_CPU,
    807                                                   3456,
    808                                                   &(pComponentPrivate->rmproxyCallback));
    809                 if(rm_error == OMX_ErrorNone) {
    810                     /* resource is available */
    811                     rm_error = RMProxy_NewSendCommand(pHandle,
    812                                                       RMProxy_StateSet,
    813                                                       OMX_G729_Decoder_COMPONENT,
    814                                                       OMX_StateIdle,
    815                                                       3456,NULL);
    816                     pComponentPrivate->curState = OMX_StateIdle;
    817                     pComponentPrivate->cbInfo.EventHandler(pHandle,
    818                                                            pHandle->pApplicationPrivate,
    819                                                            OMX_EventCmdComplete,
    820                                                            OMX_CommandStateSet,
    821                                                            pComponentPrivate->curState,
    822                                                            NULL);
    823                 }
    824                 else if(rm_error == OMX_ErrorInsufficientResources) {
    825                     /* resource is not available, need set state to OMX_StateWaitForResources */
    826                     pComponentPrivate->curState = OMX_StateWaitForResources;
    827                     pComponentPrivate->cbInfo.EventHandler(pHandle,
    828                                                            pHandle->pApplicationPrivate,
    829                                                            OMX_EventCmdComplete,
    830                                                            OMX_CommandStateSet,
    831                                                            pComponentPrivate->curState,
    832                                                            NULL);
    833                     G729DEC_DPRINT("%d :: OMX_G729Dec_Utils.c ::  Error - insufficient resources\n", __LINE__);
    834                 }
    835 #else
    836                 pComponentPrivate->curState = OMX_StateIdle;
    837                 pComponentPrivate->cbInfo.EventHandler(pHandle,
    838                                                        pHandle->pApplicationPrivate,
    839                                                        OMX_EventCmdComplete,
    840                                                        OMX_CommandStateSet,
    841                                                        pComponentPrivate->curState,
    842                                                        NULL);
    843 #endif
    844 
    845 #ifdef __PERF_INSTRUMENTATION__
    846                 PERF_Boundary(pComponentPrivate->pPERFcomp,PERF_BoundaryComplete | PERF_BoundarySetup);
    847 #endif
    848                 G729DEC_DPRINT("%d :: G729DEC: State has been Set to Idle\n",
    849                                __LINE__);
    850 
    851                 if(pComponentPrivate->dasfmode == 1) {
    852                     OMX_U32 pValues[4];
    853                     G729DEC_DPRINT("%d :: ---- Comp: DASF Functionality is ON ---\n",__LINE__);
    854                     OMX_G729MALLOC_STRUCT(pParams, G729DEC_AudioCodecParams);
    855                     G729DEC_DPRINT("Line %d:::pParams  = 0x%x\n",__LINE__,pParams );
    856                     pComponentPrivate->pParams = pParams;
    857                     /* TODO: Configure from test app */
    858                     pParams->iAudioFormat = 1;
    859                     pParams->iSamplingRate = 8000;
    860 
    861                     /*TODO: get this value from the audio manager */
    862                     pParams->iStrmId = pComponentPrivate->streamID;
    863 
    864                     pValues[0] = USN_STRMCMD_SETCODECPARAMS;
    865                     pValues[1] = (OMX_U32)pParams;
    866                     pValues[2] = sizeof(G729DEC_AudioCodecParams);
    867                     eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
    868                                                EMMCodecControlStrmCtrl,(void *)pValues);
    869 
    870                     if(eError != OMX_ErrorNone) {
    871                         G729DEC_EPRINT("%d: Error Occurred in Codec StreamControl..\n",__LINE__);
    872                         goto EXIT;
    873                     }
    874                 }
    875             }
    876             else if (pComponentPrivate->curState == OMX_StateExecuting) {
    877                 OMX_S8 *pArgs = (OMX_S8*)"damedesuStr";
    878                 /*Set the bIsStopping bit */
    879                 G729DEC_DPRINT("%d :: G729DEC: About to set bIsStopping bit\n", __LINE__);
    880 
    881 #ifdef __PERF_INSTRUMENTATION__
    882                 PERF_Boundary(pComponentPrivate->pPERFcomp,
    883                               PERF_BoundaryComplete | PERF_BoundarySteadyState);
    884 #endif
    885                 G729DEC_DPRINT("About to call LCML_ControlCodec(STOP)\n");
    886                 eError = LCML_ControlCodec(
    887                                            ((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
    888                                            MMCodecControlStop,(void *)pArgs);
    889                 if(eError != OMX_ErrorNone) {
    890                     G729DEC_EPRINT("%d: Error Occurred in Codec Stop..\n", __LINE__);
    891                     goto EXIT;
    892                 }
    893 
    894 #ifdef HASHINGENABLE
    895                 /*Hashing Change*/
    896                 pLcmlHandle = (LCML_DSP_INTERFACE*)pComponentPrivate->pLcmlHandle;
    897                 eError = LCML_FlushHashes(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle);
    898                 if (eError != OMX_ErrorNone) {
    899                     G729DEC_EPRINT("Error occurred in Codec mapping flush!\n");
    900                     break;
    901                 }
    902 #endif
    903 
    904                 pComponentPrivate->bStopSent=1;
    905                 if (pComponentPrivate->pHoldBuffer) {
    906                     free(pComponentPrivate->pHoldBuffer);
    907                     pComponentPrivate->pHoldBuffer = NULL;
    908                 }
    909                 pComponentPrivate->nHoldLength = 0;
    910             }
    911             else if(pComponentPrivate->curState == OMX_StatePause) {
    912                 G729DEC_DPRINT("%d :: Comp: Stop Command Received\n",__LINE__);
    913 
    914 #ifdef HASHINGENABLE
    915                 /*Hashing Change*/
    916                 pLcmlHandle = (LCML_DSP_INTERFACE*)pComponentPrivate->pLcmlHandle;
    917                 eError = LCML_FlushHashes(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle);
    918                 if (eError != OMX_ErrorNone) {
    919                     G729DEC_EPRINT("Error occurred in Codec mapping flush!\n");
    920                     break;
    921                 }
    922 #endif
    923                 G729DEC_DPRINT("Setting to OMX_StateIdle - Line %d\n",__LINE__);
    924                 pComponentPrivate->curState = OMX_StateIdle;
    925 
    926 #ifdef RESOURCE_MANAGER_ENABLED
    927                 rm_error = RMProxy_NewSendCommand(pHandle, RMProxy_StateSet, OMX_G729_Decoder_COMPONENT, OMX_StateIdle, 3456,NULL);
    928 #endif
    929                 G729DEC_DPRINT ("%d :: The component is stopped\n",__LINE__);
    930                 pComponentPrivate->cbInfo.EventHandler (
    931                                                         pHandle,pHandle->pApplicationPrivate,
    932                                                         OMX_EventCmdComplete,OMX_CommandStateSet,pComponentPrivate->curState,
    933                                                         NULL);
    934             }
    935             else {
    936                 /* This means, it is invalid state from application */
    937                 G729DEC_DPRINT("%d :: Comp: OMX_G729DecUtils.c\n",__LINE__);
    938                 pComponentPrivate->cbInfo.EventHandler(
    939                                                        pHandle,
    940                                                        pHandle->pApplicationPrivate,
    941                                                        OMX_EventError,
    942                                                        OMX_ErrorIncorrectStateTransition,0,
    943                                                        NULL);
    944             }
    945             break;
    946 
    947         case OMX_StateExecuting:
    948             G729DEC_DPRINT("%d: G729DECHandleCommand: Cmd Executing \n",__LINE__);
    949 
    950             if (pComponentPrivate->curState == OMX_StateIdle) {
    951                 G729DEC_DPRINT("%d :: Comp: OMX_G729DecUtils.c\n",__LINE__);
    952                 /* Sending commands to DSP via LCML_ControlCodec third argument
    953                    is not used for time being */
    954                 pComponentPrivate->nFillBufferDoneCount = 0;
    955                 pComponentPrivate->bStopSent=0;
    956                 eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
    957                                            EMMCodecControlStart, NULL);
    958                 if(eError != OMX_ErrorNone) {
    959                     G729DEC_EPRINT("%d: Error Occurred in Codec Start..\n",__LINE__);
    960                     goto EXIT;
    961                 }
    962                 /* Send input buffers to application */
    963                 nBuf = pComponentPrivate->pInputBufferList->numBuffers;
    964 
    965 
    966                 G729DEC_DPRINT ("nBuf =  %d\n",nBuf);
    967                 /* Send output buffers to codec */
    968             }
    969             else if (pComponentPrivate->curState == OMX_StatePause) {
    970                 G729DEC_DPRINT("%d :: Comp: OMX_G729DecUtils.c\n",__LINE__);
    971                 eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
    972                                            EMMCodecControlStart, (void *)p);
    973                 if (eError != OMX_ErrorNone) {
    974                     G729DEC_EPRINT ("Error While Resuming the codec\n");
    975                     goto EXIT;
    976                 }
    977 
    978                 for (i=0; i < pComponentPrivate->nNumInputBufPending; i++) {
    979                     if (pComponentPrivate->pInputBufHdrPending[i]) {
    980                         frameType = *(pComponentPrivate->pInputBufHdrPending[i]->pBuffer);
    981                         G729DECGetCorresponding_LCMLHeader(pComponentPrivate, pComponentPrivate->pInputBufHdrPending[i]->pBuffer, OMX_DirInput, &pLcmlHdr);
    982                         G729DEC_SetPending(pComponentPrivate,pComponentPrivate->pInputBufHdrPending[i],OMX_DirInput);
    983                         eError = LCML_QueueBuffer(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
    984                                                   EMMCodecInputBuffer,
    985                                                   pComponentPrivate->pInputBufHdrPending[i]->pBuffer,
    986                                                   pComponentPrivate->pInputBufHdrPending[i]->nAllocLen,
    987                                                   pComponentPrivate->pInputBufHdrPending[i]->nFilledLen,
    988                                                   (OMX_U8 *) pLcmlHdr->pIpParam,
    989                                                   sizeof(G729DEC_UAlgBufParamStruct),
    990                                                   NULL);
    991 
    992                     }
    993                 }
    994                 pComponentPrivate->nNumInputBufPending = 0;
    995 
    996                 for (i=0; i < pComponentPrivate->nNumOutputBufPending; i++) {
    997                     if (pComponentPrivate->pOutputBufHdrPending[i]) {
    998                         G729DECGetCorresponding_LCMLHeader(pComponentPrivate, pComponentPrivate->pOutputBufHdrPending[i]->pBuffer, OMX_DirOutput, &pLcmlHdr);
    999                         G729DEC_SetPending(pComponentPrivate,pComponentPrivate->pOutputBufHdrPending[i],OMX_DirOutput);
   1000                         eError = LCML_QueueBuffer(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1001                                                   EMMCodecOuputBuffer,
   1002                                                   pComponentPrivate->pOutputBufHdrPending[i]->pBuffer,
   1003                                                   pComponentPrivate->pOutputBufHdrPending[i]->nAllocLen,
   1004                                                   pComponentPrivate->pOutputBufHdrPending[i]->nFilledLen,
   1005                                                   (OMX_U8 *) pLcmlHdr->pIpParam,
   1006                                                   sizeof(G729DEC_UAlgBufParamStruct),
   1007                                                   NULL);
   1008                     }
   1009                 }
   1010                 pComponentPrivate->nNumOutputBufPending = 0;
   1011 
   1012             }
   1013             else {
   1014                 pComponentPrivate->cbInfo.EventHandler (
   1015                                                         pHandle,
   1016                                                         pHandle->pApplicationPrivate,
   1017                                                         OMX_EventError, OMX_ErrorIncorrectStateTransition,0,
   1018                                                         NULL);
   1019                 G729DEC_EPRINT("%d :: Error: Invalid State Given by Application\n",__LINE__);
   1020                 goto EXIT;
   1021 
   1022             }
   1023 
   1024 #ifdef __PERF_INSTRUMENTATION__
   1025             PERF_Boundary(pComponentPrivate->pPERFcomp,
   1026                           PERF_BoundaryStart | PERF_BoundarySteadyState);
   1027 #endif
   1028             pComponentPrivate->curState = OMX_StateExecuting;
   1029             /*Send state change notificaiton to Application */
   1030             pComponentPrivate->cbInfo.EventHandler(
   1031                                                    pHandle,
   1032                                                    pHandle->pApplicationPrivate,
   1033                                                    OMX_EventCmdComplete, OMX_CommandStateSet,pComponentPrivate->curState, NULL);
   1034 
   1035 #ifdef RESOURCE_MANAGER_ENABLED
   1036             rm_error = RMProxy_NewSendCommand(pHandle, RMProxy_StateSet, OMX_G729_Decoder_COMPONENT, OMX_StateExecuting, 3456,NULL);
   1037 #endif
   1038 
   1039             break;
   1040 
   1041         case OMX_StateLoaded:
   1042 
   1043             G729DEC_DPRINT("%d: G729DECHandleCommand: Cmd Loaded - curState = %d\n",__LINE__,pComponentPrivate->curState);
   1044             if (pComponentPrivate->curState == OMX_StateWaitForResources){
   1045                 G729DEC_DPRINT("%d: G729DECHandleCommand: Cmd Loaded\n",__LINE__);
   1046 
   1047 #ifdef __PERF_INSTRUMENTATION__
   1048                 PERF_Boundary(pComponentPrivate->pPERFcomp,
   1049                               PERF_BoundaryStart | PERF_BoundaryCleanup);
   1050 #endif
   1051 
   1052                 pComponentPrivate->curState = OMX_StateLoaded;
   1053 
   1054 #ifdef __PERF_INSTRUMENTATION__
   1055                 PERF_Boundary(pComponentPrivate->pPERFcomp,
   1056                               PERF_BoundaryComplete | PERF_BoundaryCleanup);
   1057 #endif
   1058 
   1059                 pComponentPrivate->cbInfo.EventHandler (
   1060                                                         pHandle, pHandle->pApplicationPrivate,
   1061                                                         OMX_EventCmdComplete, OMX_CommandStateSet,pComponentPrivate->curState,
   1062                                                         NULL);
   1063                 break;
   1064 
   1065             }
   1066 
   1067             if (pComponentPrivate->curState != OMX_StateIdle &&
   1068                 pComponentPrivate->curState != OMX_StateWaitForResources)
   1069             {
   1070                 pComponentPrivate->cbInfo.EventHandler (pHandle,
   1071                                                         pHandle->pApplicationPrivate,
   1072                                                         OMX_EventError,
   1073                                                         OMX_ErrorIncorrectStateTransition,0,
   1074                                                         NULL);
   1075                 G729DEC_EPRINT("%d :: Error: Invalid State Given by Application\n",__LINE__);
   1076                 goto EXIT;
   1077             }
   1078 
   1079 #ifdef __PERF_INSTRUMENTATION__
   1080             PERF_Boundary(pComponentPrivate->pPERFcomp,
   1081                           PERF_BoundaryStart | PERF_BoundaryCleanup);
   1082 #endif
   1083 
   1084             G729DEC_DPRINT("pComponentPrivate->pInputBufferList->numBuffers = %d\n",pComponentPrivate->pInputBufferList->numBuffers);
   1085             G729DEC_DPRINT("pComponentPrivate->pOutputBufferList->numBuffers = %d\n",pComponentPrivate->pOutputBufferList->numBuffers);
   1086             nOpBuf = pComponentPrivate->pOutputBufferList->numBuffers;
   1087             if (pComponentPrivate->pInputBufferList->numBuffers &&
   1088                 pComponentPrivate->pOutputBufferList->numBuffers)
   1089             {
   1090                 pComponentPrivate->InIdle_goingtoloaded = 1;
   1091 #ifndef UNDER_CE
   1092 
   1093                 pthread_mutex_lock(&pComponentPrivate->InIdle_mutex);
   1094                 pthread_cond_wait(&pComponentPrivate->InIdle_threshold,
   1095                                   &pComponentPrivate->InIdle_mutex);
   1096                 pthread_mutex_unlock(&pComponentPrivate->InIdle_mutex);
   1097 #else
   1098                 OMX_WaitForEvent(&(pComponentPrivate->InIdle_event));
   1099 #endif
   1100 
   1101             }
   1102 
   1103             /* Now Deinitialize the component No error should be returned from
   1104              * this function. It should clean the system as much as possible */
   1105             G729DEC_DPRINT("%d :: In side OMX_StateLoaded State: \n",__LINE__);
   1106             eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1107                                        EMMCodecControlDestroy, (void *)p);
   1108 
   1109             if (eError != OMX_ErrorNone) {
   1110                 G729DEC_EPRINT("%d : Error: in Destroying the codec: no.  %x\n",__LINE__, eError);
   1111                 goto EXIT;
   1112             }
   1113 
   1114 #ifdef __PERF_INSTRUMENTATION__
   1115             PERF_SendingCommand(pComponentPrivate->pPERF, -1, 0,
   1116                                 PERF_ModuleComponent);
   1117 #endif
   1118 
   1119             eError = EXIT_COMPONENT_THRD;
   1120             pComponentPrivate->bInitParamsInitialized = 0;
   1121             /* Send StateChangeNotification to application */
   1122             pComponentPrivate->bLoadedCommandPending = OMX_FALSE;
   1123             break;
   1124 
   1125         case OMX_StatePause:
   1126             G729DEC_DPRINT("%d: G729DECHandleCommand: Cmd Pause\n",__LINE__);
   1127 
   1128             if (pComponentPrivate->curState != OMX_StateExecuting &&
   1129                 pComponentPrivate->curState != OMX_StateIdle) {
   1130                 pComponentPrivate->cbInfo.EventHandler (
   1131                                                         pHandle,
   1132                                                         pHandle->pApplicationPrivate,
   1133                                                         OMX_EventError, OMX_ErrorIncorrectStateTransition,0,
   1134                                                         NULL);
   1135                 G729DEC_EPRINT("%d :: Error: Invalid State Given by \
   1136                        Application\n",__LINE__);
   1137                 goto EXIT;
   1138             }
   1139             eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1140                                        EMMCodecControlPause, (void *)p);
   1141 
   1142             if (eError != OMX_ErrorNone) {
   1143                 G729DEC_EPRINT("%d : Error: in Pausing the codec\n",__LINE__);
   1144                 goto EXIT;
   1145             }
   1146             break;
   1147 
   1148         case OMX_StateWaitForResources:
   1149 
   1150             if (pComponentPrivate->curState == OMX_StateLoaded) {
   1151 #ifdef RESOURCE_MANAGER_ENABLED
   1152                 rm_error = RMProxy_NewSendCommand(pHandle, RMProxy_StateSet, OMX_G729_Decoder_COMPONENT, OMX_StateWaitForResources, 3456,NULL);
   1153 #endif
   1154                 pComponentPrivate->curState = OMX_StateWaitForResources;
   1155                 pComponentPrivate->cbInfo.EventHandler(
   1156                                                        pHandle, pHandle->pApplicationPrivate,
   1157                                                        OMX_EventCmdComplete, OMX_CommandStateSet,pComponentPrivate->curState,NULL);
   1158             }
   1159             else{
   1160                 pComponentPrivate->cbInfo.EventHandler(
   1161                                                        pHandle, pHandle->pApplicationPrivate,
   1162                                                        OMX_EventError, OMX_ErrorIncorrectStateTransition,0, "NULL");
   1163             }
   1164             break;
   1165 
   1166 
   1167         case OMX_StateInvalid:
   1168             G729DEC_DPRINT("%d: G729DECHandleCommand: Cmd OMX_StateInvalid:\n",__LINE__);
   1169 
   1170             pComponentPrivate->curState = OMX_StateInvalid;
   1171 
   1172             pComponentPrivate->cbInfo.EventHandler(
   1173                                                    pHandle, pHandle->pApplicationPrivate,
   1174                                                    OMX_EventError, OMX_ErrorInvalidState,0, NULL);
   1175             break;
   1176 
   1177         case OMX_StateMax:
   1178             G729DEC_DPRINT("%d: G729DECHandleCommand: Cmd OMX_StateMax::\n",__LINE__);
   1179             break;
   1180         } /* End of Switch */
   1181     }
   1182     else if (command == OMX_CommandMarkBuffer) {
   1183         G729DEC_DPRINT("command OMX_CommandMarkBuffer received %d\n",__LINE__);
   1184         if(!pComponentPrivate->pMarkBuf){
   1185             /* TODO Need to handle multiple marks */
   1186             pComponentPrivate->pMarkBuf = (OMX_MARKTYPE *)(commandData);
   1187         }
   1188     }
   1189     else if (command == OMX_CommandPortDisable) {
   1190         if (!pComponentPrivate->bDisableCommandPending) {
   1191 
   1192             if(commandData == 0x0 || commandData == -1){
   1193                 pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->bEnabled = OMX_FALSE;
   1194             }
   1195 
   1196 
   1197 
   1198         }
   1199         if(commandData == 0x1 || commandData == -1){
   1200             char *pArgs = "damedesuStr";
   1201             pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->bEnabled = OMX_FALSE;
   1202             if (pComponentPrivate->curState == OMX_StateExecuting) {
   1203                 pComponentPrivate->bNoIdleOnStop = OMX_TRUE;
   1204                 G729DEC_DPRINT("Calling LCML_ControlCodec() Line %d\n",__LINE__);
   1205                 eError = LCML_ControlCodec(
   1206                                            ((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1207                                            MMCodecControlStop,(void *)pArgs);
   1208             }
   1209         }
   1210 
   1211         if(commandData == 0x0) {
   1212             if(!pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->bPopulated){
   1213                 /* return cmdcomplete event if input unpopulated */
   1214                 pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
   1215                                                        OMX_EventCmdComplete,
   1216                                                        OMX_CommandPortDisable,
   1217                                                        G729DEC_INPUT_PORT, NULL);
   1218 
   1219                 G729DEC_DPRINT("Clearing bDisableCommandPending Line %d\n",__LINE__);
   1220                 pComponentPrivate->bDisableCommandPending = 0;
   1221             }
   1222             else{
   1223                 pComponentPrivate->bDisableCommandPending = 1;
   1224                 pComponentPrivate->bDisableCommandParam = commandData;
   1225             }
   1226         }
   1227 
   1228         if(commandData == 0x1) {
   1229             if (!pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->bPopulated){
   1230                 /* return cmdcomplete event if output unpopulated */
   1231                 pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
   1232                                                        OMX_EventCmdComplete,
   1233                                                        OMX_CommandPortDisable,
   1234                                                        G729DEC_OUTPUT_PORT, NULL);
   1235 
   1236                 G729DEC_DPRINT("Clearing bDisableCommandPending Line %d\n",__LINE__);
   1237                 pComponentPrivate->bDisableCommandPending = 0;
   1238             }
   1239             else {
   1240                 pComponentPrivate->bDisableCommandPending = 1;
   1241                 pComponentPrivate->bDisableCommandParam = commandData;
   1242             }
   1243         }
   1244 
   1245         if(commandData == -1) {
   1246             if (!pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->bPopulated &&
   1247                 !pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->bPopulated){
   1248 
   1249                 /* return cmdcomplete event if inout & output unpopulated */
   1250                 pComponentPrivate->cbInfo.EventHandler(
   1251                                                        pHandle, pHandle->pApplicationPrivate,
   1252                                                        OMX_EventCmdComplete, OMX_CommandPortDisable,G729DEC_INPUT_PORT, NULL);
   1253 
   1254                 pComponentPrivate->cbInfo.EventHandler(
   1255                                                        pHandle, pHandle->pApplicationPrivate,
   1256                                                        OMX_EventCmdComplete, OMX_CommandPortDisable,G729DEC_OUTPUT_PORT, NULL);
   1257                 G729DEC_DPRINT("Clearing bDisableCommandPending Line %d\n",__LINE__);
   1258                 pComponentPrivate->bDisableCommandPending = 0;
   1259             }
   1260             else {
   1261                 pComponentPrivate->bDisableCommandPending = 1;
   1262                 pComponentPrivate->bDisableCommandParam = commandData;
   1263             }
   1264         }
   1265     }
   1266     else if (command == OMX_CommandPortEnable) {
   1267         if (!pComponentPrivate->bEnableCommandPending) {
   1268             if(commandData == 0x0 || commandData == -1){
   1269                 /* enable in port */
   1270                 G729DEC_DPRINT("setting input port to enabled\n");
   1271                 pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->bEnabled = OMX_TRUE;
   1272                 G729DEC_DPRINT("pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->bEnabled = %d\n",pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->bEnabled);
   1273 
   1274                 if(pComponentPrivate->AlloBuf_waitingsignal)
   1275                 {
   1276                     pComponentPrivate->AlloBuf_waitingsignal = 0;
   1277                 }
   1278             }
   1279             if(commandData == 0x1 || commandData == -1){
   1280                 /* enable out port */
   1281                 G729DEC_DPRINT("setting output port to enabled\n");
   1282 
   1283                 if(pComponentPrivate->AlloBuf_waitingsignal)
   1284                 {
   1285                     pComponentPrivate->AlloBuf_waitingsignal = 0;
   1286 #ifndef UNDER_CE
   1287                     pthread_mutex_lock(&pComponentPrivate->AlloBuf_mutex);
   1288                     pthread_cond_signal(&pComponentPrivate->AlloBuf_threshold);
   1289                     pthread_mutex_unlock(&pComponentPrivate->AlloBuf_mutex);
   1290 #else
   1291                     OMX_SignalEvent(&(pComponentPrivate->AlloBuf_event));
   1292 #endif
   1293                 }
   1294                 if (pComponentPrivate->curState == OMX_StateExecuting) {
   1295                     char *pArgs = "damedesuStr";
   1296                     pComponentPrivate->bDspStoppedWhileExecuting = OMX_FALSE;
   1297                     eError = LCML_ControlCodec(
   1298                                                ((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1299                                                EMMCodecControlStart,(void *)pArgs);
   1300                 }
   1301 
   1302                 pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->bEnabled = OMX_TRUE;
   1303                 G729DEC_DPRINT("pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->bEnabled = %d\n",
   1304                                pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->bEnabled);
   1305             }
   1306         }
   1307 
   1308         if(commandData == 0x0){
   1309             if(pComponentPrivate->curState == OMX_StateLoaded ||
   1310                pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->bPopulated){
   1311 
   1312                 pComponentPrivate->cbInfo.EventHandler( pHandle,
   1313                                                         pHandle->pApplicationPrivate,
   1314                                                         OMX_EventCmdComplete,
   1315                                                         OMX_CommandPortEnable,
   1316                                                         G729DEC_INPUT_PORT,
   1317                                                         NULL);
   1318                 pComponentPrivate->bEnableCommandPending = 0;
   1319             }
   1320             else {
   1321                 pComponentPrivate->bEnableCommandPending = 1;
   1322                 pComponentPrivate->bEnableCommandParam = commandData;
   1323             }
   1324         }
   1325         else if(commandData == 0x1){
   1326             if(pComponentPrivate->curState == OMX_StateLoaded ||
   1327                pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->bPopulated){
   1328 
   1329                 pComponentPrivate->cbInfo.EventHandler( pHandle,
   1330                                                         pHandle->pApplicationPrivate,
   1331                                                         OMX_EventCmdComplete, OMX_CommandPortEnable,
   1332                                                         G729DEC_OUTPUT_PORT,
   1333                                                         NULL);
   1334                 pComponentPrivate->bEnableCommandPending = 0;
   1335             }
   1336             else {
   1337                 pComponentPrivate->bEnableCommandPending = 1;
   1338                 pComponentPrivate->bEnableCommandParam = commandData;
   1339             }
   1340         }
   1341         else if(commandData == -1){
   1342             if(pComponentPrivate->curState == OMX_StateLoaded ||
   1343                (pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->bPopulated
   1344                 && pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->bPopulated)){
   1345 
   1346                 pComponentPrivate->cbInfo.EventHandler(
   1347                                                        pHandle, pHandle->pApplicationPrivate,
   1348                                                        OMX_EventCmdComplete, OMX_CommandPortEnable,G729DEC_INPUT_PORT, NULL);
   1349 
   1350                 pComponentPrivate->cbInfo.EventHandler(
   1351                                                        pHandle, pHandle->pApplicationPrivate,
   1352                                                        OMX_EventCmdComplete, OMX_CommandPortEnable,G729DEC_OUTPUT_PORT, NULL);
   1353 
   1354                 pComponentPrivate->bEnableCommandPending = 0;
   1355                 G729DECFill_LCMLInitParamsEx(pComponentPrivate->pHandle);
   1356                 pComponentPrivate->bJustReenabled = 1;
   1357             }
   1358             else {
   1359                 pComponentPrivate->bEnableCommandPending = 1;
   1360                 pComponentPrivate->bEnableCommandParam = commandData;
   1361             }
   1362         }
   1363 #ifndef UNDER_CE
   1364         pthread_mutex_lock(&pComponentPrivate->AlloBuf_mutex);
   1365         pthread_cond_signal(&pComponentPrivate->AlloBuf_threshold);
   1366         pthread_mutex_unlock(&pComponentPrivate->AlloBuf_mutex);
   1367 #else
   1368         OMX_SignalEvent(&(pComponentPrivate->AlloBuf_event));
   1369 #endif
   1370     }
   1371     else if (command == OMX_CommandFlush) {
   1372         G729DEC_DPRINT("%d:: OMX_CommandFlush\n", __LINE__);
   1373         OMX_U32 aParam[3] = {0};
   1374         if(commandData == 0x0 || commandData == -1)
   1375         {
   1376             if (pComponentPrivate->nUnhandledEmptyThisBuffers == 0) {
   1377                 aParam[0] = USN_STRMCMD_FLUSH;
   1378                 aParam[1] = 0x0;
   1379                 aParam[2] = 0x0;
   1380                 G729DEC_DPRINT("Flushing input port\n");
   1381                 eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1382                                            EMMCodecControlStrmCtrl, (void*)aParam);
   1383                 if (eError != OMX_ErrorNone)
   1384                 {
   1385                     G729DEC_EPRINT("Error flushing input port: %d\n", eError);
   1386                     goto EXIT;
   1387                 }
   1388             }
   1389             else{
   1390                 pComponentPrivate->bFlushInputPortCommandPending = OMX_TRUE;
   1391             }
   1392         }
   1393         if(commandData == 0x1 || commandData == -1)
   1394         {
   1395             if (pComponentPrivate->nUnhandledFillThisBuffers == 0)  {
   1396                 aParam[0] = USN_STRMCMD_FLUSH;
   1397                 aParam[1] = 0x1;
   1398                 aParam[2] = 0x0;
   1399                 G729DEC_DPRINT("Flushing output port\n");
   1400                 eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1401                                            EMMCodecControlStrmCtrl, (void*)aParam);
   1402                 if (eError != OMX_ErrorNone)
   1403                 {
   1404                     G729DEC_DPRINT("Error flushing output port: %d\n", eError);
   1405                     goto EXIT;
   1406                 }
   1407             }
   1408             else{
   1409                 pComponentPrivate->bFlushOutputPortCommandPending = OMX_TRUE;
   1410             }
   1411         }
   1412     }
   1413  EXIT:
   1414     G729DEC_DPRINT ("%d :: Exiting G729DECHandleCommand Function\n",__LINE__);
   1415     return eError;
   1416 }
   1417 
   1418 
   1419 /* ========================================================================== */
   1420 /**
   1421  * @G729DECHandleDataBuf_FromApp() This function is called by the component when ever it
   1422  * receives the buffer from the application
   1423  *
   1424  * @param pComponentPrivate  Component private data
   1425  * @param pBufHeader Buffer from the application
   1426  *
   1427  * @pre
   1428  *
   1429  * @post
   1430  *
   1431  * @return none
   1432  */
   1433 /* ========================================================================== */
   1434 OMX_ERRORTYPE G729DECHandleDataBuf_FromApp(OMX_BUFFERHEADERTYPE* pBufHeader,
   1435                                            G729DEC_COMPONENT_PRIVATE *pComponentPrivate)
   1436 {
   1437     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1438     OMX_DIRTYPE eDir;
   1439     LCML_G729DEC_BUFHEADERTYPE *pLcmlHdr = NULL;
   1440     LCML_DSP_INTERFACE *pLcmlHandle = (LCML_DSP_INTERFACE *)
   1441         pComponentPrivate->pLcmlHandle;
   1442     G729DEC_BufParamStruct* pInBufStruct=NULL;
   1443     /*  unsigned long int* bufParamsArray = NULL;    */
   1444 
   1445     G729DEC_DPRINT ("%d :: Entering G729DECHandleDataBuf_FromApp Function\n",__LINE__);
   1446     /*Find the direction of the received buffer from buffer list */
   1447     eError = G729DECGetBufferDirection(pBufHeader, &eDir);
   1448     if (eError != OMX_ErrorNone) {
   1449         G729DEC_DPRINT ("%d :: The PBufHeader is not found in the list\n",
   1450                         __LINE__);
   1451         goto EXIT;
   1452     }
   1453     if (eDir == OMX_DirInput) {
   1454         pComponentPrivate->nUnhandledEmptyThisBuffers--;
   1455         /*   bufParamsArray = malloc((10 * sizeof(unsigned long int)) + 256);
   1456              bufParamsArray += 128;
   1457              memset(bufParamsArray, 0, 9 * sizeof(unsigned long int)); */
   1458         pInBufStruct = (G729DEC_BufParamStruct*)pBufHeader->pInputPortPrivate;
   1459 
   1460 	 if (pInBufStruct == NULL) {
   1461 	     G729DEC_EPRINT("%d :: Error: input port NULL ...\n", __LINE__);
   1462 	     goto EXIT;
   1463 	 }
   1464         /* fill array for SN params */
   1465         if(pInBufStruct->bNoUseDefaults == OMX_TRUE){ /*indicates that khronos conformance tests are NOT running */
   1466             pComponentPrivate->bufParamsArray[0] = 0;
   1467             pComponentPrivate->bufParamsArray[1] = pInBufStruct->frameLost;
   1468             pComponentPrivate->bufParamsArray[2] = pInBufStruct->numPackets;
   1469             pComponentPrivate->bufParamsArray[3] = pInBufStruct->packetLength[0];
   1470             pComponentPrivate->bufParamsArray[4] = pInBufStruct->packetLength[1];
   1471             pComponentPrivate->bufParamsArray[5] = pInBufStruct->packetLength[2];
   1472             pComponentPrivate->bufParamsArray[6] = pInBufStruct->packetLength[3];
   1473             pComponentPrivate->bufParamsArray[7] = pInBufStruct->packetLength[4];
   1474             pComponentPrivate->bufParamsArray[8] = pInBufStruct->packetLength[5];
   1475         }
   1476         else
   1477         {
   1478             pComponentPrivate->bufParamsArray[0] = 0; /* last frame flag */
   1479             pComponentPrivate->bufParamsArray[1] = 0; /* frame lost flag */
   1480             pComponentPrivate->bufParamsArray[2] = 1; /* number of frames in this buffer */
   1481             pComponentPrivate->bufParamsArray[3] = 11; /*lengths of each frame in bytes */
   1482             pComponentPrivate->bufParamsArray[4] = 0;
   1483             pComponentPrivate->bufParamsArray[5] = 0;
   1484             pComponentPrivate->bufParamsArray[6] = 0;
   1485             pComponentPrivate->bufParamsArray[7] = 0;
   1486             pComponentPrivate->bufParamsArray[8] = 0;
   1487         }
   1488         eError = G729DECGetCorresponding_LCMLHeader(pComponentPrivate, pBufHeader->pBuffer, OMX_DirInput, &pLcmlHdr);
   1489         if (eError != OMX_ErrorNone) {
   1490             G729DEC_EPRINT("%d :: Error: Invalid Buffer Came ...\n",__LINE__);
   1491             goto EXIT;
   1492         }
   1493         if(pBufHeader->nFlags == OMX_BUFFERFLAG_EOS){ /* Last input buffer from App. */
   1494             pBufHeader->nFlags = NORMAL_BUFFER;
   1495             pLcmlHdr->pIpParam->usLastFrame = 1;
   1496             pComponentPrivate->bufParamsArray[0] = 1;
   1497             pComponentPrivate->bIsEOFSent = 1;
   1498         }
   1499         else{
   1500             pLcmlHdr->pIpParam->usLastFrame = 0;
   1501             pComponentPrivate->bufParamsArray[0] = 0;
   1502         }
   1503 	 pLcmlHdr->pIpParam->usFrameLost = pInBufStruct->frameLost;
   1504 	 if (pInBufStruct->frameLost == 1) {
   1505 	     G729DEC_PRINT_INFO("Frame LOST event\n");
   1506         }
   1507         /* Store time stamp information */
   1508         pComponentPrivate->arrTimestamp[pComponentPrivate->IpBufindex] = pBufHeader->nTimeStamp;
   1509         pComponentPrivate->arrTickCount[pComponentPrivate->IpBufindex] = pBufHeader->nTickCount;
   1510         pComponentPrivate->IpBufindex++;
   1511         pComponentPrivate->IpBufindex %= pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->nBufferCountActual;
   1512         if (pComponentPrivate->curState == OMX_StateExecuting) {
   1513             if (!G729DEC_IsPending(pComponentPrivate,pBufHeader,OMX_DirInput)) {
   1514                 G729DEC_SetPending(pComponentPrivate,pBufHeader,OMX_DirInput);
   1515                 eError = LCML_QueueBuffer(pLcmlHandle->pCodecinterfacehandle,
   1516                                           EMMCodecInputBuffer,
   1517                                           (OMX_U8 *)pBufHeader->pBuffer,
   1518                                           pBufHeader->nAllocLen,
   1519                                           pBufHeader->nFilledLen,
   1520                                           (OMX_U8 *) pComponentPrivate->bufParamsArray,
   1521                                           sizeof(pComponentPrivate->bufParamsArray),
   1522                                           NULL);
   1523                 if (eError != OMX_ErrorNone) {
   1524                     eError = OMX_ErrorHardware;
   1525                     goto EXIT;
   1526                 }
   1527                 pComponentPrivate->lcml_nCntIp++;
   1528                 pComponentPrivate->lcml_nIpBuf++;
   1529                 pComponentPrivate->num_Sent_Ip_Buff++;
   1530             }
   1531         }
   1532         else if (pComponentPrivate->curState == OMX_StatePause)  {
   1533             pComponentPrivate->pInputBufHdrPending[pComponentPrivate->nNumInputBufPending++] = pBufHeader;
   1534         }
   1535         if(pBufHeader->pMarkData){
   1536             /* copy mark to output buffer header */
   1537             pComponentPrivate->pOutputBufferList->pBufHdr[0]->pMarkData = pBufHeader->pMarkData;
   1538             pComponentPrivate->pOutputBufferList->pBufHdr[0]->hMarkTargetComponent = pBufHeader->hMarkTargetComponent;
   1539 
   1540             /* trigger event handler if we are supposed to */
   1541             if(pBufHeader->hMarkTargetComponent == pComponentPrivate->pHandle && pBufHeader->pMarkData){
   1542                 pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   1543                                                        pComponentPrivate->pHandle->pApplicationPrivate,
   1544                                                        OMX_EventMark,
   1545                                                        0,
   1546                                                        0,
   1547                                                        pBufHeader->pMarkData);
   1548             }
   1549         }
   1550         if (pComponentPrivate->bFlushInputPortCommandPending) {
   1551             OMX_SendCommand(pComponentPrivate->pHandle,OMX_CommandFlush,0,NULL);
   1552         }
   1553     }
   1554 
   1555     else if (eDir == OMX_DirOutput) {
   1556         /* Make sure that output buffer is issued to output stream only when
   1557          * there is an outstanding input buffer already issued on input stream
   1558          */
   1559         pComponentPrivate->nUnhandledFillThisBuffers--;
   1560         if (!(pComponentPrivate->bIsStopping)) {
   1561             G729DEC_DPRINT ("%d: Sending Empty OUTPUT BUFFER to Codec = %p\n",__LINE__,pBufHeader->pBuffer);
   1562             if (pComponentPrivate->curState == OMX_StateExecuting)
   1563             {
   1564                 if (!G729DEC_IsPending(pComponentPrivate,pBufHeader,OMX_DirOutput)) {
   1565                     G729DEC_SetPending(pComponentPrivate,pBufHeader,OMX_DirOutput);
   1566                     eError = G729DECGetCorresponding_LCMLHeader(pComponentPrivate, pBufHeader->pBuffer, OMX_DirOutput, &pLcmlHdr);
   1567                     if (eError != OMX_ErrorNone) {
   1568                         G729DEC_DPRINT("%d :: Error: Invalid Buffer Came ...\n",__LINE__);
   1569                         goto EXIT;
   1570                     }
   1571                     G729DEC_DPRINT("%d\n", __LINE__);
   1572                     pLcmlHdr->pIpParam->usLastFrame = 0;
   1573                     eError = LCML_QueueBuffer(pLcmlHandle->pCodecinterfacehandle,
   1574                                               EMMCodecOuputBuffer,
   1575                                               (OMX_U8 *)pBufHeader->pBuffer,
   1576                                               pBufHeader->nAllocLen,
   1577                                               pBufHeader->nAllocLen,
   1578                                               (OMX_U8 *) pLcmlHdr->pIpParam,
   1579                                               sizeof(G729DEC_UAlgBufParamStruct),
   1580                                               NULL);
   1581                     if (eError != OMX_ErrorNone ) {
   1582                         G729DEC_EPRINT ("%d :: IssuingDSP OP: Error Occurred\n",__LINE__);
   1583                         eError = OMX_ErrorHardware;
   1584                         goto EXIT;
   1585                     }
   1586                     G729DEC_DPRINT("%d\n", __LINE__);
   1587                     pComponentPrivate->lcml_nOpBuf++;
   1588                     pComponentPrivate->num_Op_Issued++;
   1589                     G729DEC_DPRINT("%d\n", __LINE__);
   1590                 }
   1591             }
   1592             else if (pComponentPrivate->curState == OMX_StatePause)
   1593             {
   1594                 pComponentPrivate->pOutputBufHdrPending[pComponentPrivate->nNumOutputBufPending++] = pBufHeader;
   1595             }
   1596         }
   1597         else {
   1598             if (pComponentPrivate->curState == OMX_StateExecuting) {
   1599                 if (!G729DEC_IsPending(pComponentPrivate,pBufHeader,OMX_DirOutput)) {
   1600                     G729DEC_SetPending(pComponentPrivate,pBufHeader,OMX_DirOutput);
   1601                     eError = G729DECGetCorresponding_LCMLHeader(pComponentPrivate, pBufHeader->pBuffer, OMX_DirOutput, &pLcmlHdr);
   1602                     if (eError != OMX_ErrorNone) {
   1603                         G729DEC_EPRINT("%d :: Error: Invalid Buffer Came ...\n",__LINE__);
   1604                         goto EXIT;
   1605                     }
   1606                     pLcmlHdr->pIpParam->usLastFrame = 0;
   1607                     eError = LCML_QueueBuffer(pLcmlHandle->pCodecinterfacehandle,
   1608                                               EMMCodecOuputBuffer,
   1609                                               (OMX_U8 *)pBufHeader->pBuffer,
   1610                                               pBufHeader->nAllocLen,
   1611                                               pBufHeader->nAllocLen,
   1612                                               (OMX_U8 *) pLcmlHdr->pIpParam,
   1613                                               sizeof(G729DEC_UAlgBufParamStruct),
   1614                                               NULL);
   1615                     if (eError != OMX_ErrorNone ) {
   1616                         G729DEC_EPRINT ("%d :: IssuingDSP OP: Error Occurred\n",__LINE__);
   1617                         eError = OMX_ErrorHardware;
   1618                         goto EXIT;
   1619                     }
   1620                     pComponentPrivate->lcml_nOpBuf++;
   1621                     pComponentPrivate->num_Op_Issued++;
   1622                 }
   1623             }
   1624             else if (pComponentPrivate->curState == OMX_StatePause){
   1625                 pComponentPrivate->pOutputBufHdrPending[pComponentPrivate->nNumOutputBufPending++] = pBufHeader;
   1626             }
   1627         }
   1628         if (pComponentPrivate->bFlushOutputPortCommandPending)
   1629         {
   1630             OMX_SendCommand( pComponentPrivate->pHandle,
   1631                              OMX_CommandFlush,
   1632                              1,NULL);
   1633         }
   1634     }
   1635     else {
   1636         eError = OMX_ErrorBadParameter;
   1637     }
   1638 
   1639  EXIT:
   1640 
   1641     G729DEC_DPRINT("%d : Exiting from  G729DECHandleDataBuf_FromApp \n",__LINE__);
   1642     return eError;
   1643 }
   1644 
   1645 /*-------------------------------------------------------------------*/
   1646 /**
   1647  * G729DECGetBufferDirection () This function is used by the component thread to
   1648  * request a buffer from the application.  Since it was called from 2 places,
   1649  * it made sense to turn this into a small function.
   1650  *
   1651  * @param pData pointer to G729 Decoder Context Structure
   1652  * @param pCur pointer to the buffer to be requested to be filled
   1653  *
   1654  * @retval none
   1655  **/
   1656 /*-------------------------------------------------------------------*/
   1657 
   1658 OMX_ERRORTYPE G729DECGetBufferDirection(OMX_BUFFERHEADERTYPE *pBufHeader,
   1659                                         OMX_DIRTYPE *eDir)
   1660 {
   1661     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1662     G729DEC_COMPONENT_PRIVATE *pComponentPrivate = pBufHeader->pPlatformPrivate;
   1663     OMX_U32 nBuf = 0;
   1664     OMX_U32 i = 0;
   1665     OMX_BUFFERHEADERTYPE *pBuf = NULL;
   1666     OMX_S16 flag = 1;
   1667 
   1668     G729DEC_DPRINT ("%d :: Entering G729DECGetBufferDirection Function\n",__LINE__);
   1669 
   1670     /*Search this buffer in input buffers list */
   1671     nBuf = pComponentPrivate->pInputBufferList->numBuffers;
   1672     for(i=0; i<nBuf; i++) {
   1673         pBuf = pComponentPrivate->pInputBufferList->pBufHdr[i];
   1674         if(pBufHeader == pBuf) {
   1675             *eDir = OMX_DirInput;
   1676             G729DEC_DPRINT ("%d :: Buffer %p is INPUT BUFFER\n",__LINE__, pBufHeader);
   1677             flag = 0;
   1678             goto EXIT;
   1679         }
   1680     }
   1681 
   1682     /*Search this buffer in input buffers list */
   1683     nBuf = pComponentPrivate->pOutputBufferList->numBuffers;
   1684     for(i=0; i<nBuf; i++) {
   1685         pBuf = pComponentPrivate->pOutputBufferList->pBufHdr[i];
   1686         if(pBufHeader == pBuf) {
   1687             *eDir = OMX_DirOutput;
   1688             G729DEC_DPRINT ("%d :: Buffer %p is OUTPUT BUFFER\n",__LINE__, pBufHeader);
   1689             flag = 0;
   1690             goto EXIT;
   1691         }
   1692     }
   1693 
   1694     if (flag == 1) {
   1695         G729DEC_DPRINT ("%d :: Buffer %p is Not Found in the List\n",__LINE__,pBufHeader);
   1696         eError = OMX_ErrorUndefined;
   1697         goto EXIT;
   1698     }
   1699  EXIT:
   1700     G729DEC_DPRINT ("%d :: Exiting G729DECGetBufferDirection Function\n",__LINE__);
   1701     return eError;
   1702 }
   1703 
   1704 /* -------------------------------------------------------------------*/
   1705 /**
   1706  *  Callback() function will be called LCML component to write the msg
   1707  *
   1708  * @param msgBuffer                 This buffer will be returned by the LCML
   1709  *
   1710  * @retval OMX_NoError              Success, ready to roll
   1711  *         OMX_Error_BadParameter   The input parameter pointer is null
   1712  **/
   1713 /*-------------------------------------------------------------------*/
   1714 
   1715 
   1716 OMX_ERRORTYPE G729DECLCML_Callback (TUsnCodecEvent event,void * args [10])
   1717 {
   1718     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1719     OMX_U8 *pBuffer = args[1];
   1720     LCML_G729DEC_BUFHEADERTYPE *pLcmlHdr = NULL;
   1721     OMX_COMPONENTTYPE *pHandle = NULL;
   1722     OMX_S16 i = 0;
   1723     G729DEC_COMPONENT_PRIVATE* pComponentPrivate = NULL;
   1724     OMX_ERRORTYPE rm_error = OMX_ErrorNone;
   1725 
   1726 
   1727     G729DEC_DPRINT ("%d :: Entering the G729DECLCML_Callback Function\n",__LINE__);
   1728     pComponentPrivate = pComponentPrivate_CC;
   1729     G729DEC_DPRINT("event = %d\n",event);
   1730 
   1731     pHandle =  pComponentPrivate->pHandle;
   1732     G729DEC_DPRINT("pHandle = %p\n", pHandle);
   1733     G729DEC_DPRINT("pComponentPrivate = %p in lcmlCallback()\n", pComponentPrivate);
   1734 
   1735     switch(event) {
   1736 
   1737     case EMMCodecDspError:
   1738         G729DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecDspError\n");
   1739         break;
   1740 
   1741     case EMMCodecInternalError:
   1742         G729DEC_EPRINT("[LCML CALLBACK EVENT]  EMMCodecInternalError\n");
   1743         break;
   1744 
   1745     case EMMCodecInitError:
   1746         G729DEC_EPRINT("[LCML CALLBACK EVENT]  EMMCodecInitError\n");
   1747         break;
   1748 
   1749     case EMMCodecDspMessageRecieved:
   1750         G729DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecDspMessageRecieved\n");
   1751         break;
   1752 
   1753     case EMMCodecBufferProcessed:
   1754         G729DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecBufferProcessed\n");
   1755         break;
   1756 
   1757     case EMMCodecProcessingStarted:
   1758         G729DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecProcessingStarted\n");
   1759         break;
   1760 
   1761     case EMMCodecProcessingPaused:
   1762         G729DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecProcessingPaused\n");
   1763         break;
   1764 
   1765     case EMMCodecProcessingStoped:
   1766         G729DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecProcessingStoped\n");
   1767         break;
   1768 
   1769     case EMMCodecProcessingEof:
   1770         G729DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecProcessingEof\n");
   1771         break;
   1772 
   1773     case EMMCodecBufferNotProcessed:
   1774         G729DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecBufferNotProcessed\n");
   1775         break;
   1776 
   1777     case EMMCodecAlgCtrlAck:
   1778         G729DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecAlgCtrlAck\n");
   1779         break;
   1780 
   1781     case EMMCodecStrmCtrlAck:
   1782         G729DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecStrmCtrlAck\n");
   1783         break;
   1784     }
   1785 
   1786     if(event == EMMCodecBufferProcessed)
   1787     {
   1788         if( (OMX_U32)args [0] == EMMCodecInputBuffer) {
   1789 
   1790             G729DEC_DPRINT("%d :: Input: pBufferr = %p\n",__LINE__, pBuffer);
   1791             eError = G729DECGetCorresponding_LCMLHeader(pComponentPrivate, pBuffer, OMX_DirInput, &pLcmlHdr);
   1792             if (eError != OMX_ErrorNone) {
   1793                 G729DEC_DPRINT("%d :: Error: Invalid Buffer Came ...\n",__LINE__);
   1794                 goto EXIT;
   1795             }
   1796 
   1797 #ifdef __PERF_INSTRUMENTATION__
   1798             PERF_ReceivedFrame(pComponentPrivate->pPERFcomp,
   1799                                PREF(pLcmlHdr->buffer, pBuffer), 0,
   1800                                PERF_ModuleCommonLayer);
   1801 #endif
   1802 
   1803             G729DEC_ClearPending(pComponentPrivate,pLcmlHdr->buffer,OMX_DirInput);
   1804             pComponentPrivate->cbInfo.EmptyBufferDone (
   1805                                                        pComponentPrivate->pHandle,
   1806                                                        pComponentPrivate->pHandle->pApplicationPrivate,
   1807                                                        pLcmlHdr->buffer);
   1808             pComponentPrivate->nEmptyBufferDoneCount++;
   1809             pComponentPrivate->lcml_nIpBuf--;
   1810             pComponentPrivate->app_nBuf++;
   1811         }
   1812         else if ((OMX_U32)args [0] == EMMCodecOuputBuffer) {
   1813             G729DEC_DPRINT("%d :: Output: pBufferr = %p\n",__LINE__, pBuffer);
   1814             eError = G729DECGetCorresponding_LCMLHeader(pComponentPrivate, pBuffer, OMX_DirOutput, &pLcmlHdr);
   1815             if (eError != OMX_ErrorNone) {
   1816                 G729DEC_DPRINT("%d :: Error: Invalid Buffer Came ...\n",__LINE__);
   1817                 goto EXIT;
   1818             }
   1819             pLcmlHdr->buffer->nFilledLen = (OMX_U32)args[8];
   1820 
   1821 #ifdef __PERF_INSTRUMENTATION__
   1822             PERF_ReceivedFrame(pComponentPrivate->pPERFcomp,
   1823                                PREF(pLcmlHdr->buffer,pBuffer),
   1824                                PREF(pLcmlHdr->buffer,nFilledLen),
   1825                                PERF_ModuleCommonLayer);
   1826             pComponentPrivate->nLcml_nCntOpReceived++;
   1827             if ((pComponentPrivate->nLcml_nCntIp >= 1) &&
   1828                 (pComponentPrivate->nLcml_nCntOpReceived == 1))
   1829             {
   1830                 PERF_Boundary(pComponentPrivate->pPERFcomp,
   1831                               PERF_BoundaryStart | PERF_BoundarySteadyState);
   1832             }
   1833 #endif
   1834 
   1835             G729DEC_DPRINT("G729DECLCML_Callback::: pLcmlHdr->buffer->nFilledLen = %d\n",pLcmlHdr->buffer->nFilledLen);
   1836             pComponentPrivate->lcml_nCntOpReceived++;
   1837 
   1838             G729DEC_ClearPending(pComponentPrivate,pLcmlHdr->buffer,OMX_DirOutput);
   1839             pComponentPrivate->nOutStandingFillDones++;
   1840             pComponentPrivate->num_Reclaimed_Op_Buff++;
   1841             eError = G729DECGetCorresponding_LCMLHeader(pComponentPrivate, pLcmlHdr->buffer->pBuffer, OMX_DirOutput, &pLcmlHdr);
   1842             if(pComponentPrivate->bIsEOFSent){
   1843                 pLcmlHdr->buffer->nFlags=OMX_BUFFERFLAG_EOS;
   1844                 pComponentPrivate->bIsEOFSent = 0;
   1845                 pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   1846                                                        pComponentPrivate->pHandle->pApplicationPrivate,
   1847                                                        OMX_EventBufferFlag,
   1848                                                        pLcmlHdr->buffer->nOutputPortIndex,
   1849                                                        pLcmlHdr->buffer->nFlags, NULL);
   1850             }
   1851             else{
   1852                 pLcmlHdr->buffer->nFlags=NORMAL_BUFFER;
   1853             }
   1854             /* Copying time stamp information to output buffer */
   1855             pLcmlHdr->buffer->nTimeStamp = pComponentPrivate->arrTimestamp[pComponentPrivate->OpBufindex];
   1856             pLcmlHdr->buffer->nTickCount = pComponentPrivate->arrTickCount[pComponentPrivate->OpBufindex];
   1857             pComponentPrivate->OpBufindex++;
   1858             pComponentPrivate->OpBufindex %= pComponentPrivate->pPortDef[G729DEC_DIRECTION_INPUT]->nBufferCountActual;
   1859             pComponentPrivate->cbInfo.FillBufferDone (
   1860                                                       pComponentPrivate->pHandle,
   1861                                                       pComponentPrivate->pHandle->pApplicationPrivate,
   1862                                                       pLcmlHdr->buffer
   1863                                                       );
   1864             pComponentPrivate->lcml_nOpBuf--;
   1865             pComponentPrivate->app_nBuf++;
   1866             pComponentPrivate->nFillBufferDoneCount++;
   1867             pComponentPrivate->nOutStandingFillDones--;
   1868         }
   1869     }
   1870     else if (event == EMMCodecStrmCtrlAck)
   1871     {
   1872         G729DEC_DPRINT("%d :: GOT MESSAGE USN_DSPACK_STRMCTRL ----\n",__LINE__);
   1873         if (args[1] == (void *)USN_STRMCMD_FLUSH)
   1874         {
   1875             G729DEC_DPRINT("revceived USN_STRMCMD_FLUSH\n");
   1876             pHandle = pComponentPrivate->pHandle;
   1877             if ( args[2] == (void *)EMMCodecInputBuffer)
   1878             {
   1879                 if (args[0] == USN_ERR_NONE ) {
   1880                     G729DEC_DPRINT("Flushing input port %d\n");
   1881                     for (i=0; i < MAX_NUM_OF_BUFS; i++)
   1882                     {
   1883                         pComponentPrivate->pInputBufHdrPending[i] = NULL;
   1884                     }
   1885                     pComponentPrivate->nNumInputBufPending=0;
   1886                     for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++)
   1887                     {
   1888                         pComponentPrivate->cbInfo.EmptyBufferDone (
   1889                                                                    pComponentPrivate->pHandle,
   1890                                                                    pComponentPrivate->pHandle->pApplicationPrivate,
   1891                                                                    pComponentPrivate->pInputBufferList->pBufHdr[i]
   1892                                                                    );
   1893                     }
   1894                     pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
   1895                                                            OMX_EventCmdComplete,
   1896                                                            OMX_CommandFlush,
   1897                                                            G729DEC_INPUT_PORT,
   1898                                                            NULL);
   1899                 }
   1900                 else
   1901                 {
   1902                     G729DEC_EPRINT("error flushing input port.\n");
   1903                     goto EXIT;
   1904                 }
   1905             }
   1906             else if ( args[2] == (void *)EMMCodecOuputBuffer)
   1907             {
   1908                 if (args[0] == USN_ERR_NONE )
   1909                 {
   1910                     G729DEC_DPRINT("Flushing output port %d\n");
   1911                     for (i=0; i < MAX_NUM_OF_BUFS; i++)
   1912                     {
   1913                         pComponentPrivate->pOutputBufHdrPending[i] = NULL;
   1914                     }
   1915                     pComponentPrivate->nNumOutputBufPending=0;
   1916                     for (i=0; i < pComponentPrivate->pOutputBufferList->numBuffers; i++)
   1917                     {
   1918 
   1919 #ifdef __PERF_INSTRUMENTATION__
   1920                         PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   1921                                           pComponentPrivate->pOutputBufferList->pBufHdr[i]->pBuffer,
   1922                                           pComponentPrivate->pOutputBufferList->pBufHdr[i]->nFilledLen,
   1923                                           PERF_ModuleHLMM);
   1924 #endif
   1925 
   1926                         pComponentPrivate->cbInfo.FillBufferDone (
   1927                                                                   pComponentPrivate->pHandle,
   1928                                                                   pComponentPrivate->pHandle->pApplicationPrivate,
   1929                                                                   pComponentPrivate->pOutputBufferList->pBufHdr[i]
   1930                                                                   );
   1931                     }
   1932                     pComponentPrivate->cbInfo.EventHandler(
   1933                                                            pHandle, pHandle->pApplicationPrivate,
   1934                                                            OMX_EventCmdComplete, OMX_CommandFlush,G729DEC_OUTPUT_PORT, NULL);
   1935                 }
   1936                 else
   1937                 {
   1938                     G729DEC_EPRINT("error flushing output port.\n");
   1939                     goto EXIT;
   1940                 }
   1941             }
   1942         }
   1943 
   1944 
   1945     }
   1946     else if(event == EMMCodecProcessingStoped) {
   1947         G729DEC_DPRINT("pComponentPrivate->bNoIdleOnStop = %d\n",pComponentPrivate->bNoIdleOnStop);
   1948         if (!pComponentPrivate->bNoIdleOnStop) {
   1949             pComponentPrivate->bIdleCommandPending = OMX_TRUE;
   1950             G729DEC_TransitionToIdle(pComponentPrivate);
   1951         }
   1952         else {
   1953             pComponentPrivate->bDspStoppedWhileExecuting = OMX_TRUE;
   1954             int i;
   1955             for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) {
   1956                 G729DEC_DPRINT("pComponentPrivate->pInputBufferList->bBufferPending[%d] = %d\n",i,pComponentPrivate->pInputBufferList->bBufferPending[i]);
   1957                 if (pComponentPrivate->pInputBufferList->bBufferPending[i])
   1958                 {
   1959                     pComponentPrivate->cbInfo.EmptyBufferDone (
   1960                                                                pComponentPrivate->pHandle,
   1961                                                                pComponentPrivate->pHandle->pApplicationPrivate,
   1962                                                                pComponentPrivate->pInputBufferList->pBufHdr[i]
   1963                                                                );
   1964                     G729DEC_ClearPending(pComponentPrivate, pComponentPrivate->pInputBufferList->pBufHdr[i], OMX_DirInput);
   1965                 }
   1966             }
   1967             pComponentPrivate->bNoIdleOnStop= OMX_FALSE;
   1968         }
   1969     }
   1970     else if (event == EMMCodecProcessingPaused) {
   1971         pComponentPrivate->curState = OMX_StatePause;
   1972         /* Send StateChangeNotification to application */
   1973         pComponentPrivate->cbInfo.EventHandler(
   1974                                                pComponentPrivate->pHandle,
   1975                                                pComponentPrivate->pHandle->pApplicationPrivate,
   1976                                                OMX_EventCmdComplete, OMX_CommandStateSet, pComponentPrivate->curState,NULL);
   1977 
   1978     }
   1979 
   1980     else if (event == EMMCodecDspError) {
   1981         if(((int)args[4] == USN_ERR_WARNING) && ((int)args[5] == IUALG_WARN_PLAYCOMPLETED)) {
   1982             OMX_COMPONENTTYPE *pHandle = pComponentPrivate->pHandle;
   1983             G729DEC_DPRINT("%d :: GOT MESSAGE IUALG_WARN_PLAYCOMPLETED\n",__LINE__);
   1984             pComponentPrivate->bPlayCompleteFlag = 1;
   1985             pComponentPrivate->curState = OMX_StateIdle;
   1986 
   1987 #ifdef RESOURCE_MANAGER_ENABLED
   1988             rm_error = RMProxy_NewSendCommand(pHandle, RMProxy_StateSet, OMX_G729_Decoder_COMPONENT, OMX_StateIdle, 3456,NULL);
   1989 #endif
   1990         }
   1991         if(((int)args[4] == USN_ERR_WARNING) && ((int)args[5] == IUALG_WARN_OVERFLOW)) {
   1992             OMX_COMPONENTTYPE *pHandle = pComponentPrivate->pHandle;
   1993             pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
   1994                                                    OMX_EventError, OMX_ErrorOverflow,
   1995                                                    pComponentPrivate->curState, NULL);
   1996             G729DEC_DPRINT("%d :: GOT WARNING IUALG_WARN_OVERFLOW\n",__LINE__);
   1997         }
   1998         if(((int)args[4] == USN_ERR_PROCESS) && ((int)args[5] == IUALG_ERR_DATA_CORRUPT)){
   1999             OMX_COMPONENTTYPE *pHandle = pComponentPrivate->pHandle;
   2000             pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
   2001                                                    OMX_EventError, OMX_ErrorStreamCorrupt,
   2002                                                    pComponentPrivate->curState, NULL);
   2003             G729DEC_DPRINT("%d :: GOT ERROR IUALG_ERR_DATA_CORRUPT\n",__LINE__);
   2004         }
   2005     }
   2006 
   2007     if(event == EMMCodecDspMessageRecieved) {
   2008         G729DEC_DPRINT("%d :: commandedState  = %d\n",__LINE__,args[0]);
   2009         G729DEC_DPRINT("%d :: arg1 = %d\n",__LINE__,args[1]);
   2010         G729DEC_DPRINT("%d :: arg2 = %d\n",__LINE__,args[2]);
   2011     }
   2012 
   2013  EXIT:
   2014     G729DEC_DPRINT ("%d :: Exiting the G729DECLCML_Callback Function\n",__LINE__);
   2015     return eError;
   2016 }
   2017 
   2018 
   2019 OMX_ERRORTYPE G729DECGetCorresponding_LCMLHeader(G729DEC_COMPONENT_PRIVATE* pComponentPrivate,
   2020                                                  OMX_U8 *pBuffer,
   2021                                                  OMX_DIRTYPE eDir,
   2022                                                  LCML_G729DEC_BUFHEADERTYPE **ppLcmlHdr)
   2023 {
   2024     OMX_ERRORTYPE eError = OMX_ErrorNone;
   2025     LCML_G729DEC_BUFHEADERTYPE *pLcmlBufHeader = NULL;
   2026     OMX_S16 nIpBuf = 0;
   2027     OMX_S16 nOpBuf = 0;
   2028     OMX_S16 i = 0;
   2029 
   2030     nIpBuf = (OMX_S16)pComponentPrivate->pInputBufferList->numBuffers;
   2031     nOpBuf = (OMX_S16)pComponentPrivate->pOutputBufferList->numBuffers;
   2032     G729DEC_DPRINT("enter get corresponding LCML header\n");
   2033     G729DEC_DPRINT("pComponentPrivate = %p\n",pComponentPrivate);
   2034     G729DEC_DPRINT("eDir = %d\n",eDir);
   2035     if(eDir == OMX_DirInput) {
   2036         G729DEC_DPRINT("pComponentPrivate = %p\n",pComponentPrivate);
   2037         pLcmlBufHeader = pComponentPrivate->pLcmlBufHeader[G729DEC_INPUT_PORT];
   2038         for(i=0; i<nIpBuf; i++) {
   2039             if(pBuffer == pLcmlBufHeader->buffer->pBuffer) {
   2040                 *ppLcmlHdr = pLcmlBufHeader;
   2041                 G729DEC_DPRINT("%d::Corresponding LCML Header Found\n",__LINE__);
   2042                 goto EXIT;
   2043             }
   2044             pLcmlBufHeader++;
   2045         }
   2046     }
   2047     else if (eDir == OMX_DirOutput) {
   2048         pLcmlBufHeader = pComponentPrivate->pLcmlBufHeader[G729DEC_OUTPUT_PORT];
   2049         for(i=0; i<nOpBuf; i++) {
   2050             if(pBuffer == pLcmlBufHeader->buffer->pBuffer) {
   2051                 G729DEC_DPRINT("pBuffer = %p\n",pBuffer);
   2052                 G729DEC_DPRINT("pLcmlBufHeader->buffer->pBuffer = %p\n",pLcmlBufHeader->buffer->pBuffer);
   2053                 *ppLcmlHdr = pLcmlBufHeader;
   2054                 G729DEC_DPRINT("%d::Corresponding LCML Header Found\n",__LINE__);
   2055                 goto EXIT;
   2056             }
   2057             pLcmlBufHeader++;
   2058         }
   2059     }
   2060     else {
   2061         G729DEC_DPRINT("%d:: Invalid Buffer Type :: exiting...\n",__LINE__);
   2062     }
   2063 
   2064  EXIT:
   2065     return eError;
   2066 }
   2067 
   2068 
   2069 #ifndef UNDER_CE
   2070 
   2071 OMX_HANDLETYPE G729DECGetLCMLHandle(G729DEC_COMPONENT_PRIVATE* pComponentPrivate)
   2072 {
   2073     void *handle = NULL;
   2074     OMX_ERRORTYPE (*fpGetHandle)(OMX_HANDLETYPE);
   2075     OMX_HANDLETYPE pHandle = NULL;
   2076     OMX_S8 *error = NULL;
   2077     OMX_ERRORTYPE eError = OMX_ErrorNone;
   2078 
   2079     G729DEC_DPRINT("G729DECGetLCMLHandle %d\n",__LINE__);
   2080     handle = dlopen("libLCML.so", RTLD_LAZY);
   2081     if (!handle) {
   2082         fputs(dlerror(), stderr);
   2083         goto EXIT;
   2084     }
   2085 
   2086     fpGetHandle = dlsym (handle, "GetHandle");
   2087     if ((error = (OMX_S8 *)dlerror()) != NULL) {
   2088         fputs((char *)error, stderr);
   2089         goto EXIT;
   2090     }
   2091     eError = (*fpGetHandle)(&pHandle);
   2092     if(eError != OMX_ErrorNone) {
   2093         eError = OMX_ErrorUndefined;
   2094         G729DEC_EPRINT("eError != OMX_ErrorNone...\n");
   2095         pHandle = NULL;
   2096         goto EXIT;
   2097     }
   2098 
   2099     pComponentPrivate->bLcmlHandleOpened = 1;
   2100 
   2101  EXIT:
   2102     G729DEC_DPRINT("G729GetLCMLHandle returning %p\n",pHandle);
   2103 
   2104     return pHandle;
   2105 }
   2106 
   2107 
   2108 #else
   2109 
   2110 //WINDOWS Explicit dll load procedure
   2111 
   2112 OMX_HANDLETYPE G729DECGetLCMLHandle(G729DEC_COMPONENT_PRIVATE* pComponentPrivate)
   2113 {
   2114     typedef OMX_ERRORTYPE (*LPFNDLLFUNC1)(OMX_HANDLETYPE);
   2115     OMX_HANDLETYPE pHandle = NULL;
   2116     OMX_ERRORTYPE eError = OMX_ErrorNone;
   2117     LPFNDLLFUNC1 fpGetHandle1;
   2118 
   2119 
   2120     g_hLcmlDllHandle = LoadLibraryEx(TEXT("OAF_BML.dll"), NULL,0);
   2121     if (g_hLcmlDllHandle == NULL)
   2122     {
   2123         //fputs(dlerror(), stderr);
   2124         G729DEC_EPRINT("BML Load Failed!!!\n");
   2125         return pHandle;
   2126     }
   2127 
   2128     fpGetHandle1 = (LPFNDLLFUNC1)GetProcAddress(g_hLcmlDllHandle,TEXT("GetHandle"));
   2129     if (!fpGetHandle1)
   2130     {
   2131         // handle the error
   2132         FreeLibrary(g_hLcmlDllHandle);
   2133         g_hLcmlDllHandle = NULL;
   2134         return pHandle;
   2135     }
   2136 
   2137     // call the function
   2138     eError = fpGetHandle1(&pHandle);
   2139     if(eError != OMX_ErrorNone) {
   2140         eError = OMX_ErrorUndefined;
   2141         G729DEC_EPRINT("eError != OMX_ErrorNone...\n");
   2142         FreeLibrary(g_hLcmlDllHandle);
   2143         g_hLcmlDllHandle = NULL;
   2144         pHandle = NULL;
   2145         return pHandle;
   2146     }
   2147     return pHandle;
   2148 }
   2149 
   2150 
   2151 #endif
   2152 
   2153 
   2154 #ifndef UNDER_CE
   2155 
   2156 OMX_ERRORTYPE G729DECFreeLCMLHandle(G729DEC_COMPONENT_PRIVATE* pComponentPrivate)
   2157 {
   2158 
   2159     OMX_S16 retValue = 0;
   2160     OMX_ERRORTYPE eError = OMX_ErrorNone;
   2161 
   2162     if (pComponentPrivate->bLcmlHandleOpened) {
   2163         retValue = dlclose(pComponentPrivate->pLcmlHandle);
   2164 
   2165         if (retValue != 0) {
   2166             eError = OMX_ErrorUndefined;
   2167         }
   2168         pComponentPrivate->bLcmlHandleOpened = 0;
   2169     }
   2170 
   2171     return eError;
   2172 }
   2173 #else
   2174 
   2175 
   2176 OMX_ERRORTYPE G729DECFreeLCMLHandle(G729DEC_COMPONENT_PRIVATE* pComponentPrivate)
   2177 {
   2178 
   2179     OMX_S16 retValue = 0;
   2180     OMX_ERRORTYPE eError = OMX_ErrorNone;
   2181 
   2182     if (pComponentPrivate->bLcmlHandleOpened) {
   2183 
   2184         retValue = FreeLibrary(pComponentPrivate->pLcmlHandle);
   2185         if (retValue == 0) {          /* Zero Indicates failure */
   2186             eError = OMX_ErrorUndefined;
   2187         }
   2188         pComponentPrivate->bLcmlHandleOpened = 0;
   2189     }
   2190 
   2191     return eError;
   2192 }
   2193 
   2194 
   2195 
   2196 #endif
   2197 
   2198 void G729DEC_SetPending(G729DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir)
   2199 {
   2200     OMX_U16 i = 0;
   2201 
   2202     if (eDir == OMX_DirInput) {
   2203         for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) {
   2204             if (pBufHdr == pComponentPrivate->pInputBufferList->pBufHdr[i]) {
   2205                 pComponentPrivate->pInputBufferList->bBufferPending[i] = 1;
   2206                 G729DEC_DPRINT("*******************INPUT BUFFER %d IS PENDING******************************\n",i);
   2207             }
   2208         }
   2209     }
   2210     else {
   2211         for (i=0; i < pComponentPrivate->pOutputBufferList->numBuffers; i++) {
   2212             if (pBufHdr == pComponentPrivate->pOutputBufferList->pBufHdr[i]) {
   2213                 pComponentPrivate->pOutputBufferList->bBufferPending[i] = 1;
   2214                 G729DEC_DPRINT("*******************OUTPUT BUFFER %d IS PENDING******************************\n",i);
   2215             }
   2216         }
   2217     }
   2218 }
   2219 
   2220 void G729DEC_ClearPending(G729DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir)
   2221 {
   2222     OMX_U16 i = 0;
   2223 
   2224     if (eDir == OMX_DirInput) {
   2225         for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) {
   2226             if (pBufHdr == pComponentPrivate->pInputBufferList->pBufHdr[i]) {
   2227                 pComponentPrivate->pInputBufferList->bBufferPending[i] = 0;
   2228                 G729DEC_DPRINT("*******************INPUT BUFFER %d IS RECLAIMED******************************\n",i);
   2229             }
   2230         }
   2231     }
   2232     else {
   2233         for (i=0; i < pComponentPrivate->pOutputBufferList->numBuffers; i++) {
   2234             if (pBufHdr == pComponentPrivate->pOutputBufferList->pBufHdr[i]) {
   2235                 pComponentPrivate->pOutputBufferList->bBufferPending[i] = 0;
   2236                 G729DEC_DPRINT("*******************OUTPUT BUFFER %d IS RECLAIMED ******************************\n",i);
   2237             }
   2238         }
   2239     }
   2240 }
   2241 
   2242 OMX_U32 G729DEC_IsPending(G729DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir)
   2243 {
   2244     OMX_U16 i = 0;
   2245 
   2246     if (eDir == OMX_DirInput) {
   2247         for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) {
   2248             if (pBufHdr == pComponentPrivate->pInputBufferList->pBufHdr[i]) {
   2249                 return pComponentPrivate->pInputBufferList->bBufferPending[i];
   2250             }
   2251         }
   2252     }
   2253     else {
   2254         for (i=0; i < pComponentPrivate->pOutputBufferList->numBuffers; i++) {
   2255             if (pBufHdr == pComponentPrivate->pOutputBufferList->pBufHdr[i]) {
   2256                 return pComponentPrivate->pOutputBufferList->bBufferPending[i];
   2257             }
   2258         }
   2259     }
   2260     return -1;
   2261 }
   2262 
   2263 
   2264 OMX_U32 G729DEC_IsValid(G729DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U8 *pBuffer, OMX_DIRTYPE eDir)
   2265 {
   2266     OMX_U16 i = 0;
   2267     OMX_S16 found=0;
   2268 
   2269     if (eDir == OMX_DirInput) {
   2270         for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) {
   2271             if (pBuffer == pComponentPrivate->pInputBufferList->pBufHdr[i]->pBuffer) {
   2272                 found = 1;
   2273             }
   2274         }
   2275     }
   2276     else {
   2277         for (i=0; i < pComponentPrivate->pOutputBufferList->numBuffers; i++) {
   2278             if (pBuffer == pComponentPrivate->pOutputBufferList->pBufHdr[i]->pBuffer) {
   2279                 found = 1;
   2280             }
   2281         }
   2282     }
   2283     return found;
   2284 }
   2285 
   2286 
   2287 OMX_ERRORTYPE G729DECFill_LCMLInitParamsEx (OMX_HANDLETYPE  pComponent )
   2288 {
   2289     OMX_ERRORTYPE eError = OMX_ErrorNone;
   2290     OMX_U32 nIpBuf = 0,nIpBufSize = 0,nOpBuf = 0,nOpBufSize = 0;
   2291     OMX_U16 i = 0;
   2292     OMX_BUFFERHEADERTYPE *pTemp = NULL;
   2293     OMX_S16 size_lcml = 0;
   2294     LCML_STRMATTR *strmAttr = NULL;
   2295     LCML_DSP_INTERFACE *pHandle = (LCML_DSP_INTERFACE *)pComponent;
   2296     G729DEC_COMPONENT_PRIVATE *pComponentPrivate = NULL;
   2297     LCML_G729DEC_BUFHEADERTYPE *pTemp_lcml = NULL;
   2298 
   2299     G729DEC_DPRINT("%d :: G729DECFill_LCMLInitParams\n ",__LINE__);
   2300     G729DEC_DPRINT("%d :: pHandle = %p\n",__LINE__,pHandle);
   2301     G729DEC_DPRINT("%d :: pHandle->pComponentPrivate = %p\n",__LINE__,pHandle->pComponentPrivate);
   2302     pComponentPrivate = pHandle->pComponentPrivate;
   2303 
   2304     nIpBuf = pComponentPrivate->pInputBufferList->numBuffers;
   2305     nIpBufSize = pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->nBufferSize;
   2306 
   2307 
   2308     nOpBuf = pComponentPrivate->pOutputBufferList->numBuffers;
   2309     nOpBufSize = pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->nBufferSize;
   2310 
   2311 
   2312     size_lcml = (OMX_U16)(nIpBuf * sizeof(LCML_G729DEC_BUFHEADERTYPE));
   2313     pTemp_lcml = (LCML_G729DEC_BUFHEADERTYPE *)malloc(size_lcml);
   2314     G729DEC_MEMPRINT("%d:[ALLOC] %p\n",__LINE__,pTemp_lcml);
   2315     if(pTemp_lcml == NULL) {
   2316         G729DEC_EPRINT("%d :: Memory Allocation Failed\n",__LINE__);
   2317         /* Free previously allocated memory before bailing */
   2318         if (strmAttr) {
   2319             free(strmAttr);
   2320             strmAttr = NULL;
   2321         }
   2322         eError = OMX_ErrorInsufficientResources;
   2323         goto EXIT;
   2324     }
   2325     memset(pTemp_lcml, 0x0, size_lcml);
   2326     pComponentPrivate->pLcmlBufHeader[G729DEC_INPUT_PORT] = pTemp_lcml;
   2327 
   2328     for (i=0; i<nIpBuf; i++) {
   2329         pTemp = pComponentPrivate->pInputBufferList->pBufHdr[i];
   2330         pTemp->nSize = sizeof(OMX_BUFFERHEADERTYPE);
   2331         pTemp->nAllocLen = nIpBufSize;
   2332         pTemp->nFilledLen = nIpBufSize;
   2333         pTemp->nVersion.s.nVersionMajor = G729DEC_MAJOR_VER;
   2334         pTemp->nVersion.s.nVersionMinor = G729DEC_MINOR_VER;
   2335         pTemp->pPlatformPrivate = pHandle->pComponentPrivate;
   2336         pTemp_lcml->buffer = pTemp;
   2337         pTemp_lcml->eDir = OMX_DirInput;
   2338 
   2339         OMX_G729MALLOC_STRUCT(pTemp_lcml->pIpParam, G729DEC_UAlgBufParamStruct);
   2340         pTemp_lcml->pIpParam->usFrameLost = 0;
   2341         pTemp_lcml->pIpParam->usLastFrame = 0;
   2342 
   2343         /* This means, it is not a last buffer. This flag is to be modified by
   2344          * the application to indicate the last buffer */
   2345         pTemp->nFlags = NORMAL_BUFFER;
   2346 
   2347         pTemp_lcml++;
   2348     }
   2349 
   2350     /* Allocate memory for all output buffer headers..
   2351      * This memory pointer will be sent to LCML */
   2352     size_lcml = (OMX_U16)(nOpBuf * sizeof(LCML_G729DEC_BUFHEADERTYPE));
   2353     pTemp_lcml = (LCML_G729DEC_BUFHEADERTYPE *)malloc(size_lcml);
   2354     G729DEC_MEMPRINT("%d:[ALLOC] %p\n",__LINE__,pTemp_lcml);
   2355     if(pTemp_lcml == NULL) {
   2356         /* Free previously allocated memory before bailing */
   2357         if (strmAttr) {
   2358             free(strmAttr);
   2359             strmAttr = NULL;
   2360         }
   2361         eError = OMX_ErrorInsufficientResources;
   2362         goto EXIT;
   2363     }
   2364     memset(pTemp_lcml, 0x0, size_lcml);
   2365     pComponentPrivate->pLcmlBufHeader[G729DEC_OUTPUT_PORT] = pTemp_lcml;
   2366 
   2367     for (i=0; i<nOpBuf; i++) {
   2368         pTemp = pComponentPrivate->pOutputBufferList->pBufHdr[i];
   2369         pTemp->nSize = sizeof(OMX_BUFFERHEADERTYPE);
   2370         pTemp->nAllocLen = nOpBufSize;
   2371         pTemp->nFilledLen = nOpBufSize;
   2372         pTemp->nVersion.s.nVersionMajor = G729DEC_MAJOR_VER;
   2373         pTemp->nVersion.s.nVersionMinor = G729DEC_MINOR_VER;
   2374         pComponentPrivate->nVersion = pTemp->nVersion.nVersion;
   2375         pTemp->pPlatformPrivate = pHandle->pComponentPrivate;
   2376         pTemp->nTickCount = 0;
   2377         pTemp->nTimeStamp = 0;
   2378         /* This means, it is not a last buffer. This flag is to be modified by
   2379          * the application to indicate the last buffer */
   2380 
   2381         pTemp_lcml->buffer = pTemp;
   2382         pTemp_lcml->eDir = OMX_DirOutput;
   2383         G729DEC_DPRINT("%d:::pTemp_lcml = %p\n",__LINE__,pTemp_lcml);
   2384         G729DEC_DPRINT("%d:::pTemp_lcml->buffer = %p\n",__LINE__,pTemp_lcml->buffer);
   2385 
   2386         OMX_G729MALLOC_STRUCT(pTemp_lcml->pIpParam, G729DEC_UAlgBufParamStruct);
   2387         pTemp_lcml->pIpParam->usFrameLost = 0;
   2388         pTemp_lcml->pIpParam->usLastFrame = 0;
   2389 
   2390         pTemp->nFlags = NORMAL_BUFFER;
   2391 
   2392         pTemp++;
   2393         pTemp_lcml++;
   2394     }
   2395     pComponentPrivate->bPortDefsAllocated = 1;
   2396     G729DEC_DPRINT("%d :: Exiting G729DECFill_LCMLInitParams",__LINE__);
   2397 
   2398     pComponentPrivate->bInitParamsInitialized = 1;
   2399  EXIT:
   2400     return eError;
   2401 }
   2402 /* ================================================================================= */
   2403 /**
   2404  * @fn G729DEC_TransitionToIdle() Transition component to OMX_StateIdle
   2405  G729DEC_TransitionToIdle().
   2406  This method transitions the component to OMX_StateIdle
   2407  * @param pComponent  handle for this instance of the component
   2408  *
   2409  * @pre
   2410  *
   2411  * @post
   2412  *
   2413  * @return OMX_ERRORTYPE
   2414  */
   2415 /* ================================================================================ */
   2416 OMX_ERRORTYPE G729DEC_TransitionToIdle(G729DEC_COMPONENT_PRIVATE *pComponentPrivate)
   2417 {
   2418     OMX_ERRORTYPE eError = OMX_ErrorNone;
   2419     OMX_ERRORTYPE rm_error = OMX_ErrorNone;
   2420     OMX_U16 i = 0;
   2421     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *) pComponentPrivate->pHandle;
   2422 
   2423     G729DEC_DPRINT("Entered G729DEC_TransitionToIdle\n");
   2424     G729DEC_DPRINT("pComponentPrivate->nOutStandingFillDones = %d\n",pComponentPrivate->nOutStandingFillDones);
   2425 
   2426 
   2427     if (pComponentPrivate->nOutStandingFillDones <= 0) {
   2428 
   2429         /* If there are any buffers still marked as pending they must have
   2430            been queued after the socket node was stopped */
   2431         for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) {
   2432             if (pComponentPrivate->pInputBufferList->bBufferPending[i])
   2433             {
   2434 
   2435 #ifdef __PERF_INSTRUMENTATION__
   2436                 PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   2437                                   pComponentPrivate->pInputBufferList->pBufHdr[i]->pBuffer,
   2438                                   0,
   2439                                   PERF_ModuleHLMM);
   2440 #endif
   2441 
   2442                 pComponentPrivate->cbInfo.EmptyBufferDone (
   2443                                                            pComponentPrivate->pHandle,
   2444                                                            pComponentPrivate->pHandle->pApplicationPrivate,
   2445                                                            pComponentPrivate->pInputBufferList->pBufHdr[i]
   2446                                                            );
   2447                 G729DEC_ClearPending(pComponentPrivate, pComponentPrivate->pInputBufferList->pBufHdr[i], OMX_DirInput);
   2448             }
   2449         }
   2450         for (i=0; i < pComponentPrivate->pOutputBufferList->numBuffers; i++) {
   2451             if (pComponentPrivate->pOutputBufferList->bBufferPending[i])
   2452             {
   2453 #ifdef __PERF_INSTRUMENTATION__
   2454                 PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   2455                                   pComponentPrivate->pOutputBufferList->pBufHdr[i]->pBuffer,
   2456                                   pComponentPrivate->pOutputBufferList->pBufHdr[i]->nFilledLen,
   2457                                   PERF_ModuleHLMM);
   2458 #endif
   2459                 pComponentPrivate->cbInfo.FillBufferDone (
   2460                                                           pComponentPrivate->pHandle,
   2461                                                           pComponentPrivate->pHandle->pApplicationPrivate,
   2462                                                           pComponentPrivate->pOutputBufferList->pBufHdr[i]
   2463                                                           );
   2464                 pComponentPrivate->nOutStandingFillDones--;
   2465                 G729DEC_ClearPending(pComponentPrivate, pComponentPrivate->pOutputBufferList->pBufHdr[i], OMX_DirOutput);
   2466             }
   2467         }
   2468         G729DEC_DPRINT("Setting to OMX_StateIdle - Line %d\n",__LINE__);
   2469         pComponentPrivate->curState = OMX_StateIdle;
   2470 
   2471 #ifdef RESOURCE_MANAGER_ENABLED
   2472         rm_error = RMProxy_NewSendCommand(pHandle, RMProxy_StateSet, OMX_G729_Decoder_COMPONENT, OMX_StateIdle, 3456,NULL);
   2473 #endif
   2474 
   2475         if (pComponentPrivate->bPreempted == 0)
   2476         {
   2477             pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   2478                                                    pComponentPrivate->pHandle->pApplicationPrivate,
   2479                                                    OMX_EventCmdComplete,
   2480                                                    OMX_CommandStateSet,
   2481                                                    pComponentPrivate->curState,
   2482                                                    NULL);
   2483         }
   2484         else
   2485         {
   2486             pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   2487                                                    pComponentPrivate->pHandle->pApplicationPrivate,
   2488                                                    OMX_EventError,
   2489                                                    OMX_ErrorResourcesPreempted,
   2490                                                    0,
   2491                                                    NULL);
   2492 
   2493         }
   2494         pComponentPrivate->bIdleCommandPending = OMX_FALSE;
   2495     }
   2496     return eError;
   2497 }
   2498 
   2499 
   2500 #ifdef RESOURCE_MANAGER_ENABLED
   2501 /***********************************
   2502  *  Callback to the RM                                       *
   2503  ***********************************/
   2504 void G729DEC_ResourceManagerCallback(RMPROXY_COMMANDDATATYPE cbData)
   2505 {
   2506     OMX_COMMANDTYPE Cmd = OMX_CommandStateSet;
   2507     OMX_STATETYPE state = OMX_StateIdle;
   2508     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)cbData.hComponent;
   2509     G729DEC_COMPONENT_PRIVATE *pCompPrivate = NULL;
   2510 
   2511     pCompPrivate = (G729DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
   2512 
   2513     if (*(cbData.RM_Error) == OMX_RmProxyCallback_ResourcesPreempted){
   2514         if (pCompPrivate->curState == OMX_StateExecuting ||
   2515             pCompPrivate->curState == OMX_StatePause) {
   2516 
   2517             write (pCompPrivate->cmdPipe[1], &Cmd, sizeof(Cmd));
   2518             write (pCompPrivate->cmdDataPipe[1], &state ,sizeof(OMX_U32));
   2519 
   2520             pCompPrivate->bPreempted = 1;
   2521         }
   2522     }
   2523     else if (*(cbData.RM_Error) == OMX_RmProxyCallback_ResourcesAcquired){
   2524         pCompPrivate->cbInfo.EventHandler ( pHandle,
   2525                                             pHandle->pApplicationPrivate,
   2526                                             OMX_EventResourcesAcquired,
   2527                                             0, 0, NULL);
   2528     }
   2529 }
   2530 #endif
   2531