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_G722Dec_Utils.c
     30  *
     31  * This file implements various utilitiy functions for various activities
     32  * like handling command from application, callback from LCML etc.
     33  *
     34  * @path  $(CSLPATH)\OMAPSW_MPU\linux\audio\src\openmax_il\g722_dec\src
     35  *
     36  * @rev  1.0
     37  */
     38 /* ----------------------------------------------------------------------------
     39  *!
     40  *! Revision History
     41  *! ===================================
     42  *! 21-sept-2006 bk: updated some review findings for alpha release
     43  *! 24-Aug-2006 bk: Khronos OpenMAX (TM) 1.0 Conformance tests some more
     44  *! 18-July-2006 bk: Khronos OpenMAX (TM) 1.0 Conformance tests validated for few cases
     45  *! This is newest file
     46  * =========================================================================== */
     47 /* ------compilation control switches -------------------------*/
     48 /****************************************************************
     49  *  INCLUDE FILES
     50  ****************************************************************/
     51 /* ----- system and platform files ----------------------------*/
     52 
     53 #ifdef UNDER_CE
     54 #include <windows.h>
     55 #include <oaf_osal.h>
     56 #include <omx_core.h>
     57 #include <stdlib.h>
     58 #else
     59 #include <unistd.h>
     60 #include <sys/types.h>
     61 #include <sys/stat.h>
     62 #include <dlfcn.h>
     63 #include <malloc.h>
     64 #include <memory.h>
     65 #include <fcntl.h>
     66 #include <signal.h>
     67 #include <sys/time.h>
     68 #endif
     69 
     70 #include <pthread.h>
     71 #include <dbapi.h>
     72 #include <string.h>
     73 #include <stdio.h>
     74 
     75 /*------- Program Header Files -----------------------------------------------*/
     76 #include "LCML_DspCodec.h"
     77 #include "OMX_G722Dec_Utils.h"
     78 #include "g722decsocket_ti.h"
     79 
     80 #include <decode_common_ti.h>
     81 #include "usn.h"
     82 
     83 
     84 #ifdef UNDER_CE
     85 #define HASHINGENABLE 1
     86 void sleep(DWORD Duration)
     87 {
     88     Sleep(Duration);
     89 
     90 }
     91 #endif
     92 
     93 #ifndef UNDER_CE
     94 #define G722DEC_DPRINT_ON(...)  fprintf(stdout, "%s %d::  ",__FUNCTION__, __LINE__); \
     95     fprintf(stdout, __VA_ARGS__);                                       \
     96     fprintf(stdout, "\n");
     97 #endif
     98 
     99 /* ================================================================================= * */
    100 /**
    101  * @fn G722DEC_ComponentThread() This is component thread that keeps listening for
    102  * commands or event/messages/buffers from application or from LCML.
    103  *
    104  * @param pThreadData This is thread argument.
    105  *
    106  * @pre          None
    107  *
    108  * @post         None
    109  *
    110  *  @return      OMX_ErrorNone = Always
    111  *
    112  *  @see         None
    113  */
    114 /* ================================================================================ * */
    115 void* G722DEC_ComponentThread (void* pThreadData)
    116 {
    117     int status = 0;
    118     struct timespec tv;
    119     int fdmax = 0;
    120     fd_set rfds;
    121     OMX_U32 nRet = 0;
    122     OMX_ERRORTYPE eError = OMX_ErrorNone;
    123     G722DEC_COMPONENT_PRIVATE* pComponentPrivate = (G722DEC_COMPONENT_PRIVATE*)pThreadData;
    124     OMX_COMPONENTTYPE *pHandle = pComponentPrivate->pHandle;
    125 
    126     G722DEC_DPRINT (":: Entering ComponentThread \n");
    127 
    128     fdmax = pComponentPrivate->cmdPipe[0];
    129 
    130     if (pComponentPrivate->dataPipe[0] > fdmax) {
    131         fdmax = pComponentPrivate->dataPipe[0];
    132     }
    133 
    134     while (1) {
    135         FD_ZERO (&rfds);
    136         FD_SET (pComponentPrivate->cmdPipe[0], &rfds);
    137         FD_SET (pComponentPrivate->dataPipe[0], &rfds);
    138         tv.tv_sec = 1;
    139         tv.tv_nsec = 0;
    140 
    141         sigset_t set;
    142         sigemptyset (&set);
    143         sigaddset (&set, SIGALRM);
    144         status = pselect (fdmax+1, &rfds, NULL, NULL, &tv, &set);
    145 
    146         if (0 == status) {
    147             G722DEC_DPRINT("\n\n\n!!!!!  Component Time Out !!!!!!!!!!!! \n");
    148             if (pComponentPrivate->bExitCompThrd == 1) {
    149                 G722DEC_DPRINT(":: Comp Thrd Exiting here...\n");
    150                 goto EXIT;
    151             }
    152 
    153         } else if (-1 == status) {
    154             G722DEC_DPRINT (":: Error in Select\n");
    155             pComponentPrivate->cbInfo.EventHandler (
    156                                                     pHandle,pHandle->pApplicationPrivate,
    157                                                     OMX_EventError,OMX_ErrorInsufficientResources, 0,
    158                                                     "Error from COmponent Thread in select");
    159             eError = OMX_ErrorInsufficientResources;
    160 
    161         } else if ((FD_ISSET (pComponentPrivate->dataPipe[0], &rfds))) {
    162             /*                   && (pComponentPrivate->curState != OMX_StatePause)) { */
    163             OMX_BUFFERHEADERTYPE *pBufHeader = NULL;
    164 
    165             G722DEC_DPRINT (":: DATA pipe is set in Component Thread\n");
    166             int ret = read(pComponentPrivate->dataPipe[0], &pBufHeader, sizeof(pBufHeader));
    167             if (ret == -1) {
    168                 G722DEC_DPRINT (":: Error while reading from the pipe\n");
    169             }
    170 
    171             eError = G722DEC_HandleDataBuf_FromApp (pBufHeader,pComponentPrivate);
    172             if (eError != OMX_ErrorNone) {
    173                 G722DEC_DPRINT (":: Error From HandleDataBuf_FromApp\n");
    174                 break;
    175             }
    176         } else if (FD_ISSET (pComponentPrivate->cmdPipe[0], &rfds)) {
    177             G722DEC_DPRINT (":: CMD pipe is set in Component Thread\n");
    178 
    179             nRet = G722DEC_HandleCommand (pComponentPrivate);
    180             if (nRet == EXIT_COMPONENT_THRD) {
    181                 G722DEC_DPRINT ("Exiting from Component thread\n");
    182                 G722DEC_CleanupInitParams(pHandle);
    183                 G722DEC_STATEPRINT("****************** Component State Set to Loaded\n\n");
    184 
    185                 pComponentPrivate->curState = OMX_StateLoaded;
    186                 pComponentPrivate->cbInfo.EventHandler(
    187                                                        pHandle, pHandle->pApplicationPrivate,
    188                                                        OMX_EventCmdComplete,
    189                                                        OMX_ErrorNone,pComponentPrivate->curState, NULL);
    190             }
    191         }
    192     }
    193  EXIT:
    194 
    195     pComponentPrivate->bCompThreadStarted = 0;
    196 
    197     G722DEC_DPRINT (":: Exiting ComponentThread \n");
    198     return (void*)eError;
    199 }
    200 /* ================================================================================= * */
    201 /**
    202  * @fn G722DEC_Fill_LCMLInitParams() fills the LCML initialization structure.
    203  *
    204  * @param pHandle This is component handle allocated by the OMX core.
    205  *
    206  * @param plcml_Init This structure is filled and sent to LCML.
    207  *
    208  * @pre          None
    209  *
    210  * @post         None
    211  *
    212  *  @return      OMX_ErrorNone = Successful Inirialization of the LCML struct.
    213  *               OMX_ErrorInsufficientResources = Not enough memory
    214  *
    215  *  @see         None
    216  */
    217 /* ================================================================================ * */
    218 OMX_ERRORTYPE G722DEC_Fill_LCMLInitParams(OMX_HANDLETYPE pComponent,
    219                                           LCML_DSP *plcml_Init, OMX_U16 arr[])
    220 {
    221     OMX_ERRORTYPE eError = OMX_ErrorNone;
    222     OMX_U32 nIpBuf = 0,nIpBufSize = 0,nOpBuf = 0,nOpBufSize = 0;
    223     OMX_U32 i = 0;
    224     OMX_BUFFERHEADERTYPE *pTemp = NULL;
    225     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent;
    226     G722DEC_COMPONENT_PRIVATE *pComponentPrivate =
    227         (G722DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
    228     G722D_LCML_BUFHEADERTYPE *pTemp_lcml = NULL;
    229     OMX_U32 size_lcml = 0;
    230     /*int inputPortFlag=0,outputPortFlag=0;*/
    231     LCML_STRMATTR *strmAttr = NULL;
    232     OMX_U8 *ptemp = NULL;
    233 
    234     G722DEC_DPRINT(":: Entered Fill_LCMLInitParams");
    235 
    236     G722DEC_DPRINT("%d :: OMX_StateLoaded [G722D_INPUT_PORT]->bPopulated  %d \n",
    237                    __LINE__,pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bPopulated);
    238     G722DEC_DPRINT("%d :: OMX_StateLoaded [G722D_INPUT_PORT]->bEnabled    %d \n",
    239                    __LINE__,pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bEnabled);
    240     G722DEC_DPRINT("%d :: OMX_StateLoaded [G722D_OUTPUT_PORT]->bPopulated %d \n",
    241                    __LINE__,pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->bPopulated);
    242     G722DEC_DPRINT("%d :: OMX_StateLoaded [G722D_OUTPUT_PORT]->bEnabled   %d \n",
    243                    __LINE__,pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->bEnabled);
    244 
    245     pComponentPrivate->strmAttr = NULL;
    246 
    247     nIpBuf = pComponentPrivate->pInputBufferList->numBuffers;
    248     pComponentPrivate->nRuntimeInputBuffers = nIpBuf;
    249     nOpBuf = pComponentPrivate->pOutputBufferList->numBuffers;
    250     pComponentPrivate->nRuntimeOutputBuffers = nOpBuf;
    251     nIpBufSize = pComponentPrivate->pPortDef[G722D_INPUT_PORT]->nBufferSize;
    252     nOpBufSize = pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->nBufferSize;
    253 
    254     G722DEC_BUFPRINT("Input Buffer Count = %ld\n",nIpBuf);
    255     G722DEC_BUFPRINT("Input Buffer Size = %ld\n",nIpBufSize);
    256     G722DEC_BUFPRINT("Output Buffer Count = %ld\n",nOpBuf);
    257     G722DEC_BUFPRINT("Output Buffer Size = %ld\n",nOpBufSize);
    258 
    259     plcml_Init->In_BufInfo.nBuffers = nIpBuf;
    260     plcml_Init->In_BufInfo.nSize = nIpBufSize;
    261     plcml_Init->In_BufInfo.DataTrMethod = DMM_METHOD;
    262     plcml_Init->Out_BufInfo.nBuffers = nOpBuf;
    263     plcml_Init->Out_BufInfo.nSize = nOpBufSize;
    264     plcml_Init->Out_BufInfo.DataTrMethod = DMM_METHOD;
    265 
    266 
    267     plcml_Init->NodeInfo.nNumOfDLLs = 3;
    268 
    269     memset(plcml_Init->NodeInfo.AllUUIDs[0].DllName,0,
    270            sizeof(plcml_Init->NodeInfo.AllUUIDs[0].DllName));
    271     memset(plcml_Init->NodeInfo.AllUUIDs[1].DllName,0,
    272            sizeof(plcml_Init->NodeInfo.AllUUIDs[1].DllName));
    273     memset(plcml_Init->NodeInfo.AllUUIDs[2].DllName,0,
    274            sizeof(plcml_Init->NodeInfo.AllUUIDs[1].DllName));
    275     memset(plcml_Init->NodeInfo.AllUUIDs[0].DllName,0,
    276            sizeof(plcml_Init->DeviceInfo.AllUUIDs[1].DllName));
    277 
    278     plcml_Init->NodeInfo.AllUUIDs[0].uuid = &G722DECSOCKET_TI_UUID;
    279     strcpy ((char*)plcml_Init->NodeInfo.AllUUIDs[0].DllName, G722DEC_DLL_NAME);
    280     plcml_Init->NodeInfo.AllUUIDs[0].eDllType = DLL_NODEOBJECT;
    281 
    282     plcml_Init->NodeInfo.AllUUIDs[1].uuid = &G722DECSOCKET_TI_UUID;
    283     strcpy ((char*)plcml_Init->NodeInfo.AllUUIDs[1].DllName, G722DEC_DLL_NAME);
    284     plcml_Init->NodeInfo.AllUUIDs[1].eDllType = DLL_DEPENDENT;
    285 
    286     plcml_Init->NodeInfo.AllUUIDs[2].uuid = &USN_TI_UUID;
    287     strcpy ((char*)plcml_Init->NodeInfo.AllUUIDs[2].DllName, USN_DLL_NAME);
    288     plcml_Init->NodeInfo.AllUUIDs[2].eDllType = DLL_DEPENDENT;
    289 
    290     plcml_Init->SegID = OMX_G722DEC_DEFAULT_SEGMENT;
    291     plcml_Init->Timeout = OMX_G722DEC_SN_TIMEOUT;
    292     plcml_Init->Alignment = 0;
    293     plcml_Init->Priority = OMX_G722DEC_SN_PRIORITY;
    294 
    295     plcml_Init->ProfileID = 0;
    296 
    297     G722DEC_BUFPRINT("DLL name0 = %s\n",plcml_Init->NodeInfo.AllUUIDs[0].DllName);
    298     G722DEC_BUFPRINT("DLL name1 = %s\n",plcml_Init->NodeInfo.AllUUIDs[1].DllName);
    299     G722DEC_BUFPRINT("DLL name2 = %s\n",plcml_Init->NodeInfo.AllUUIDs[2].DllName);
    300 
    301     if(pComponentPrivate->dasfmode == 1) {
    302 #ifndef DSP_RENDERING_ON
    303         G722D_OMX_ERROR_EXIT(eError, OMX_ErrorInsufficientResources,
    304                              "Flag DSP_RENDERING_ON Must Be Defined To Use Rendering");
    305 #else
    306         G722D_OMX_MALLOC(strmAttr,LCML_STRMATTR);
    307         pComponentPrivate->strmAttr = strmAttr;
    308         G722DEC_DPRINT(":: G722 DECODER IS RUNNING UNDER DASF MODE \n");
    309 
    310         strmAttr->uSegid = OMX_G722DEC_DEFAULT_SEGMENT;
    311         strmAttr->uAlignment = 0;
    312         strmAttr->uTimeout = OMX_G722DEC_SN_TIMEOUT;
    313         strmAttr->uBufsize = nOpBufSize;
    314         strmAttr->uNumBufs = G722D_NUM_OUTPUT_BUFFERS;
    315         strmAttr->lMode = STRMMODE_PROCCOPY;
    316         plcml_Init->DeviceInfo.TypeofDevice = 1;
    317         plcml_Init->DeviceInfo.TypeofRender = 0;
    318         plcml_Init->DeviceInfo.AllUUIDs[0].uuid = &DCTN_TI_UUID;
    319         plcml_Init->DeviceInfo.DspStream = strmAttr;
    320 #endif
    321     } else {
    322         plcml_Init->DeviceInfo.TypeofDevice = 0;
    323     }
    324 
    325     if (pComponentPrivate->dasfmode == 0){
    326         G722DEC_DPRINT(":: FILE MODE CREATE PHASE PARAMETERS\n");
    327         arr[0] = 2;
    328         arr[1] = 0;
    329         arr[2] = 0;
    330 
    331         if(pComponentPrivate->pInputBufferList->numBuffers == 0) {
    332             arr[3] = G722D_NUM_INPUT_BUFFERS;
    333         } else {
    334             arr[3] = (OMX_U16) nIpBuf;
    335         }
    336 
    337         arr[4] = 1;
    338         arr[5] = 0;
    339         if(pComponentPrivate->pOutputBufferList->numBuffers == 0) {
    340             arr[6] = G722D_NUM_OUTPUT_BUFFERS;
    341         } else {
    342             arr[6] = (OMX_U16) nOpBuf;
    343         }
    344 
    345     } else {
    346         G722DEC_DPRINT(":: DASF MODE CREATE PHASE PARAMETERS\n");
    347         arr[0] = 2;
    348         arr[1] = 0;
    349         arr[2] = 0;
    350 
    351         if(pComponentPrivate->pInputBufferList->numBuffers == 0) {
    352             arr[3] = G722D_NUM_INPUT_BUFFERS;
    353         } else {
    354             arr[3] = (OMX_U16) nIpBuf;
    355         }
    356 
    357         arr[4] = 1;
    358         arr[5] = 2;
    359         arr[6] = G722D_NUM_OUTPUT_BUFFERS;
    360     }
    361 
    362     /* set codec selection (64kbps <-> 0 / 56kbps <-> 1 / 48kbps <-> 2) */
    363     if (pComponentPrivate->G722Params[G722D_INPUT_PORT]->nSamplingRate == 64000) {
    364         arr[7] = 0;
    365     } else if (pComponentPrivate->G722Params[G722D_INPUT_PORT]->nSamplingRate == 56000) {
    366         arr[7] = 1;
    367     } else if (pComponentPrivate->G722Params[G722D_INPUT_PORT]->nSamplingRate == 48000) {
    368         arr[7] = 2;
    369     } else {
    370         /* Free previously allocated memory before bailing */
    371         /*G722D_OMX_FREE(strmAttr);
    372           G722D_OMX_FREE(arr);*/
    373         G722D_OMX_ERROR_EXIT(eError, OMX_ErrorBadParameter,
    374                              "Input bit rate not supported");
    375     }
    376     arr[8] = END_OF_CR_PHASE_ARGS;
    377     plcml_Init->pCrPhArgs = arr;
    378 
    379     G722DEC_DPRINT(":: bufAlloced = %d\n",pComponentPrivate->bufAlloced);
    380     size_lcml = nIpBuf * sizeof(G722D_LCML_BUFHEADERTYPE);
    381     G722D_OMX_MALLOC_SIZE(pTemp_lcml,size_lcml,G722D_LCML_BUFHEADERTYPE);
    382 
    383     pComponentPrivate->pLcmlBufHeader[G722D_INPUT_PORT] = pTemp_lcml;
    384 
    385     for (i=0; i<nIpBuf; i++) {
    386         pTemp = pComponentPrivate->pInputBufferList->pBufHdr[i];
    387 
    388         pTemp->nSize = sizeof(OMX_BUFFERHEADERTYPE);
    389         G722DEC_DPRINT("IP: pTemp->nSize = %ld\n",pTemp->nSize);
    390 
    391         /*pTemp->nAllocLen = nIpBufSize;*/
    392         pTemp->nFilledLen = nIpBufSize;
    393         pTemp->nVersion.s.nVersionMajor = G722DEC_MAJOR_VER;
    394         pTemp->nVersion.s.nVersionMinor = G722DEC_MINOR_VER;
    395 
    396         pTemp->pPlatformPrivate = pHandle->pComponentPrivate;
    397         pTemp->nTickCount = DONT_CARE;
    398 
    399         pTemp_lcml->pBufHdr = pTemp;
    400         pTemp_lcml->eDir = OMX_DirInput;
    401         pTemp_lcml->pOtherParams[i] = NULL;
    402 
    403         G722D_OMX_MALLOC(pTemp_lcml->pIpParam,G722DEC_ParamStruct);
    404         pTemp_lcml->pIpParam->usLastFrame = 0;
    405 
    406         pTemp->nFlags = NORMAL_BUFFER;
    407         ((G722DEC_COMPONENT_PRIVATE *) pTemp->pPlatformPrivate)->pHandle = pHandle;
    408 
    409         G722DEC_DPRINT("::Comp: InBuffHeader[%ld] = %p\n", i, pTemp);
    410         G722DEC_DPRINT("::Comp:  >>>> InputBuffHeader[%ld]->pBuffer = %p\n", i, pTemp->pBuffer);
    411         G722DEC_DPRINT("::Comp: Ip : pTemp_lcml[%ld] = %p\n", i, pTemp_lcml);
    412 
    413         pTemp_lcml++;
    414     }
    415 
    416     size_lcml = nOpBuf * sizeof(G722D_LCML_BUFHEADERTYPE);
    417     G722D_OMX_MALLOC_SIZE(pTemp_lcml,size_lcml,G722D_LCML_BUFHEADERTYPE);
    418     pComponentPrivate->pLcmlBufHeader[G722D_OUTPUT_PORT] = pTemp_lcml;
    419 
    420     for (i=0; i<nOpBuf; i++) {
    421         pTemp = pComponentPrivate->pOutputBufferList->pBufHdr[i];
    422 
    423         pTemp->nSize = sizeof(OMX_BUFFERHEADERTYPE);
    424 
    425         pTemp->nAllocLen = nOpBufSize;
    426         pTemp->nVersion.s.nVersionMajor = G722DEC_MAJOR_VER;
    427         pTemp->nVersion.s.nVersionMinor = G722DEC_MINOR_VER;
    428 
    429 
    430         pTemp->pPlatformPrivate = pHandle->pComponentPrivate;
    431         pTemp->nTickCount = DONT_CARE;
    432 
    433         pTemp_lcml->pBufHdr = pTemp;
    434         pTemp_lcml->eDir = OMX_DirOutput;
    435         pTemp_lcml->pOtherParams[i] = NULL;
    436 
    437         pTemp->nFlags = NORMAL_BUFFER;
    438         ((G722DEC_COMPONENT_PRIVATE *)pTemp->pPlatformPrivate)->pHandle = pHandle;
    439         G722DEC_DPRINT("::Comp:  >>>>>>>>>>>>> OutBuffHeader[%ld] = %p\n", i, pTemp);
    440         G722DEC_DPRINT("::Comp:  >>>> OutBuffHeader[%ld]->pBuffer = %p\n", i, pTemp->pBuffer);
    441         G722DEC_DPRINT("::Comp: Op : pTemp_lcml[%ld] = %p\n", i, pTemp_lcml);
    442         pTemp_lcml++;
    443     }
    444 
    445     G722D_OMX_MALLOC_SIZE(pComponentPrivate->pParams,(sizeof(G722D_USN_AudioCodecParams) + 256),
    446                           G722D_USN_AudioCodecParams);
    447     ptemp = (OMX_U8*)pComponentPrivate->pParams;
    448     ptemp += 128;
    449     pComponentPrivate->pParams = (G722D_USN_AudioCodecParams*)ptemp;
    450 
    451     pComponentPrivate->bPortDefsAllocated = 1;
    452     pComponentPrivate->bInitParamsInitialized = 1;
    453 
    454  EXIT:
    455     if(eError == OMX_ErrorInsufficientResources || eError == OMX_ErrorBadParameter){
    456         G722D_OMX_FREE(strmAttr);
    457         G722D_OMX_FREE(arr);
    458         G722D_OMX_FREE(pTemp_lcml);
    459     }
    460     G722DEC_DPRINT("Exiting G722DEC_Fill_LCMLInitParams\n");
    461     return eError;
    462 }
    463 
    464 /* ================================================================================= * */
    465 /**
    466  * @fn G722Dec_StartCompThread() starts the component thread. This is internal
    467  * function of the component.
    468  *
    469  * @param pHandle This is component handle allocated by the OMX core.
    470  *
    471  * @pre          None
    472  *
    473  * @post         None
    474  *
    475  *  @return      OMX_ErrorNone = Successful Inirialization of the component\n
    476  *               OMX_ErrorInsufficientResources = Not enough memory
    477  *
    478  *  @see         None
    479  */
    480 /* ================================================================================ * */
    481 OMX_ERRORTYPE G722Dec_StartCompThread(OMX_HANDLETYPE pComponent)
    482 {
    483     OMX_ERRORTYPE eError = OMX_ErrorNone;
    484     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent;
    485     G722DEC_COMPONENT_PRIVATE *pComponentPrivate =
    486         (G722DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
    487     int nRet = 0;
    488 #ifdef UNDER_CE
    489     pthread_attr_t attr;
    490     memset(&attr, 0, sizeof(attr));
    491     attr.__inheritsched = PTHREAD_EXPLICIT_SCHED;
    492     attr.__schedparam.__sched_priority = OMX_AUDIO_DECODER_THREAD_PRIORITY;
    493 #endif
    494 
    495     G722DEC_DPRINT (":: Enetering  G722Dec_StartCompThread()\n");
    496 
    497     pComponentPrivate->lcml_nOpBuf = 0;
    498     pComponentPrivate->lcml_nIpBuf = 0;
    499     pComponentPrivate->app_nBuf = 0;
    500     pComponentPrivate->num_Op_Issued = 0;
    501     pComponentPrivate->num_Sent_Ip_Buff = 0;
    502     pComponentPrivate->num_Reclaimed_Op_Buff = 0;
    503     pComponentPrivate->bIsEOFSent = 0;
    504 
    505     nRet = pipe (pComponentPrivate->dataPipe);
    506     if (0 != nRet) {
    507         G722D_OMX_ERROR_EXIT(eError, OMX_ErrorInsufficientResources,
    508                              "Pipe Creation Failed");
    509     }
    510 
    511     nRet = pipe (pComponentPrivate->cmdPipe);
    512     if (0 != nRet) {
    513         G722D_OMX_ERROR_EXIT(eError, OMX_ErrorInsufficientResources,
    514                              "Pipe Creation Failed");
    515     }
    516 
    517     nRet = pipe (pComponentPrivate->cmdDataPipe);
    518     if (0 != nRet) {
    519         G722D_OMX_ERROR_EXIT(eError, OMX_ErrorInsufficientResources,
    520                              "Pipe Creation Failed");
    521     }
    522 
    523     nRet = pipe (pComponentPrivate->lcml_Pipe);
    524     if (0 != nRet) {
    525         G722D_OMX_ERROR_EXIT(eError, OMX_ErrorInsufficientResources,
    526                              "Pipe Creation Failed");
    527     }
    528 
    529 #ifdef UNDER_CE
    530     nRet = pthread_create (&(pComponentPrivate->ComponentThread), &attr,
    531                            G722DEC_ComponentThread, pComponentPrivate);
    532 #else
    533     nRet = pthread_create (&(pComponentPrivate->ComponentThread), NULL,
    534                            G722DEC_ComponentThread, pComponentPrivate);
    535 #endif
    536     if ((0 != nRet) || (!pComponentPrivate->ComponentThread)) {
    537         G722D_OMX_ERROR_EXIT(eError, OMX_ErrorInsufficientResources,
    538                              "Thread Creation Failed");
    539     }
    540 
    541     pComponentPrivate->bCompThreadStarted = 1;
    542     G722DEC_DPRINT (":: Exiting from G722Dec_StartCompThread()\n");
    543 
    544  EXIT:
    545     return eError;
    546 }
    547 
    548 
    549 /* ================================================================================= * */
    550 /**
    551  * @fn G722DEC_FreeCompResources() function frees the component resources.
    552  *
    553  * @param pComponent This is the component handle.
    554  *
    555  * @pre          None
    556  *
    557  * @post         None
    558  *
    559  *  @return      OMX_ErrorNone = Successful Inirialization of the component\n
    560  *               OMX_ErrorHardware = Hardware error has occured.
    561  *
    562  *  @see         None
    563  */
    564 /* ================================================================================ * */
    565 OMX_ERRORTYPE G722DEC_FreeCompResources(OMX_HANDLETYPE pComponent)
    566 {
    567     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent;
    568     G722DEC_COMPONENT_PRIVATE *pComponentPrivate = (G722DEC_COMPONENT_PRIVATE *)
    569         pHandle->pComponentPrivate;
    570     OMX_ERRORTYPE eError = OMX_ErrorNone;
    571     OMX_U32 nIpBuf=0, nOpBuf=0;
    572     int nRet=0;
    573 
    574     G722DEC_DPRINT (":: G722Dec_FreeCompResources\n");
    575 
    576     G722DEC_DPRINT(":::pComponentPrivate->bPortDefsAllocated = %ld\n",
    577                    pComponentPrivate->bPortDefsAllocated);
    578     if (pComponentPrivate->bPortDefsAllocated) {
    579         nIpBuf = pComponentPrivate->pInputBufferList->numBuffers;
    580         nOpBuf = pComponentPrivate->pOutputBufferList->numBuffers;
    581     }
    582     G722DEC_DPRINT(":: Closing pipess.....\n");
    583 
    584     nRet = close (pComponentPrivate->dataPipe[0]);
    585     if (0 != nRet && OMX_ErrorNone == eError) {
    586         eError = OMX_ErrorHardware;
    587     }
    588 
    589     nRet = close (pComponentPrivate->dataPipe[1]);
    590     if (0 != nRet && OMX_ErrorNone == eError) {
    591         eError = OMX_ErrorHardware;
    592     }
    593 
    594     nRet = close (pComponentPrivate->cmdPipe[0]);
    595     if (0 != nRet && OMX_ErrorNone == eError) {
    596         eError = OMX_ErrorHardware;
    597     }
    598 
    599     nRet = close (pComponentPrivate->cmdPipe[1]);
    600     if (0 != nRet && OMX_ErrorNone == eError) {
    601         eError = OMX_ErrorHardware;
    602     }
    603 
    604     nRet = close (pComponentPrivate->cmdDataPipe[0]);
    605     if (0 != nRet && OMX_ErrorNone == eError) {
    606         eError = OMX_ErrorHardware;
    607     }
    608 
    609     nRet = close (pComponentPrivate->cmdDataPipe[1]);
    610     if (0 != nRet && OMX_ErrorNone == eError) {
    611         eError = OMX_ErrorHardware;
    612     }
    613 
    614     nRet = close (pComponentPrivate->lcml_Pipe[0]);
    615     if (0 != nRet && OMX_ErrorNone == eError) {
    616         eError = OMX_ErrorHardware;
    617     }
    618 
    619     nRet = close (pComponentPrivate->lcml_Pipe[1]);
    620     if (0 != nRet && OMX_ErrorNone == eError) {
    621         eError = OMX_ErrorHardware;
    622     }
    623 
    624     if (pComponentPrivate->bPortDefsAllocated) {
    625         G722D_OMX_FREE(pComponentPrivate->pPortDef[G722D_INPUT_PORT]);
    626         G722D_OMX_FREE(pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]);
    627         G722D_OMX_FREE(pComponentPrivate->G722Params[G722D_INPUT_PORT]);
    628         G722D_OMX_FREE(pComponentPrivate->G722Params[G722D_OUTPUT_PORT]);
    629         G722D_OMX_FREE(pComponentPrivate->pCompPort[G722D_INPUT_PORT]->pPortFormat);
    630         G722D_OMX_FREE(pComponentPrivate->pCompPort[G722D_OUTPUT_PORT]->pPortFormat);
    631         G722D_OMX_FREE(pComponentPrivate->pCompPort[G722D_INPUT_PORT]);
    632         G722D_OMX_FREE(pComponentPrivate->pCompPort[G722D_OUTPUT_PORT]);
    633         G722D_OMX_FREE(pComponentPrivate->sPortParam);
    634         G722D_OMX_FREE(pComponentPrivate->pPriorityMgmt);
    635         G722D_OMX_FREE(pComponentPrivate->pInputBufferList);
    636         G722D_OMX_FREE(pComponentPrivate->pOutputBufferList);
    637         G722D_OMX_FREE(pComponentPrivate->componentRole);
    638     }
    639 
    640     pComponentPrivate->bPortDefsAllocated = 0;
    641 
    642 #ifndef UNDER_CE
    643     G722DEC_DPRINT("\n\n FreeCompResources: Destroying mutexes.\n\n");
    644     pthread_mutex_destroy(&pComponentPrivate->InLoaded_mutex);
    645     pthread_cond_destroy(&pComponentPrivate->InLoaded_threshold);
    646 
    647     pthread_mutex_destroy(&pComponentPrivate->InIdle_mutex);
    648     pthread_cond_destroy(&pComponentPrivate->InIdle_threshold);
    649 
    650     pthread_mutex_destroy(&pComponentPrivate->AlloBuf_mutex);
    651     pthread_cond_destroy(&pComponentPrivate->AlloBuf_threshold);
    652 #else
    653     OMX_DestroyEvent(&(pComponentPrivate->InLoaded_event));
    654     OMX_DestroyEvent(&(pComponentPrivate->InIdle_event));
    655     OMX_DestroyEvent(&(pComponentPrivate->AlloBuf_event));
    656 #endif
    657 
    658     return eError;
    659 }
    660 
    661 /* ================================================================================= * */
    662 /**
    663  * @fn G722DEC_HandleCommand() function handles the command sent by the application.
    664  * All the state transitions, except from nothing to loaded state, of the
    665  * component are done by this function.
    666  *
    667  * @param pComponentPrivate  This is component's private date structure.
    668  *
    669  * @pre          None
    670  *
    671  * @post         None
    672  *
    673  *  @return      OMX_ErrorNone = Successful processing.
    674  *               OMX_ErrorInsufficientResources = Not enough memory
    675  *               OMX_ErrorHardware = Hardware error has occured lile LCML failed
    676  *               to do any said operartion.
    677  *
    678  *  @see         None
    679  */
    680 /* ================================================================================ * */
    681 OMX_U32 G722DEC_HandleCommand (G722DEC_COMPONENT_PRIVATE *pComponentPrivate)
    682 {
    683     OMX_U32 i = 0,ret = 0;
    684     OMX_ERRORTYPE eError = OMX_ErrorNone;
    685     char *pArgs = "damedesuStr";
    686     OMX_COMPONENTTYPE *pHandle =
    687         (OMX_COMPONENTTYPE *) pComponentPrivate->pHandle;
    688     OMX_COMMANDTYPE command;
    689     OMX_STATETYPE commandedState = OMX_StateInvalid;
    690     OMX_U32 commandData = 0;
    691     OMX_HANDLETYPE pLcmlHandle = pComponentPrivate->pLcmlHandle;
    692 
    693     /* L89FLUSH */
    694     int numCalls = 0;
    695     OMX_U16 arr[10] = {0};
    696 
    697     G722DEC_DPRINT (":: >>> Entering HandleCommand Function\n");
    698 
    699     ret = read (pComponentPrivate->cmdPipe[0], &command, sizeof (command));
    700     if(ret == -1){
    701         G722DEC_DPRINT ("%d :: Error in Reading from the Data pipe\n", __LINE__);
    702         eError = OMX_ErrorHardware;
    703         goto EXIT;
    704     }
    705     ret = read (pComponentPrivate->cmdDataPipe[0], &commandData, sizeof (commandData));
    706     if(ret == -1){
    707         G722DEC_DPRINT ("%d :: Error in Reading from the Data pipe\n", __LINE__);
    708         eError = OMX_ErrorHardware;
    709         goto EXIT;
    710     }
    711     G722DEC_DPRINT("---------------------------------------------\n");
    712     G722DEC_DPRINT(":: command = %d\n",command);
    713     G722DEC_DPRINT(":: commandData = %ld\n",commandData);
    714     G722DEC_DPRINT("---------------------------------------------\n");
    715 
    716     if (command == OMX_CommandStateSet) {
    717         commandedState = (OMX_STATETYPE)commandData;
    718         if (pComponentPrivate->curState == commandedState) {
    719             pComponentPrivate->cbInfo.EventHandler (pHandle, pHandle->pApplicationPrivate,
    720                                                     OMX_EventError, OMX_ErrorSameState,0,
    721                                                     NULL);
    722             G722DEC_DPRINT(":: Error: Same State Given by Application\n");
    723         } else {
    724             switch(commandedState) {
    725             case OMX_StateIdle:
    726                 G722DEC_DPRINT(": HandleCommand: Cmd Idle \n");
    727                 if (pComponentPrivate->curState == OMX_StateLoaded) {
    728                     LCML_CALLBACKTYPE cb;
    729                     LCML_DSP *pLcmlDsp = NULL;
    730                     char *p = "damedesuStr";
    731                     int inputPortFlag=0,outputPortFlag=0;
    732 
    733                     if (pComponentPrivate->dasfmode == 1) {
    734                         pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->bEnabled= FALSE;
    735                         pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->bPopulated= FALSE;
    736                         if(pComponentPrivate->streamID == 0) {
    737                             G722DEC_DPRINT("**************************************\n");
    738                             G722DEC_DPRINT(":: Error = OMX_ErrorInsufficientResources\n");
    739                             G722DEC_DPRINT("**************************************\n");
    740                             eError = OMX_ErrorInsufficientResources;
    741                             pComponentPrivate->curState = OMX_StateInvalid;
    742                             pComponentPrivate->cbInfo.EventHandler(pHandle,
    743                                                                    pHandle->pApplicationPrivate,
    744                                                                    OMX_EventError, OMX_ErrorInvalidState,
    745                                                                    0,
    746                                                                    NULL);
    747                             goto EXIT;
    748                         }
    749                     }
    750 
    751                     G722DEC_DPRINT("%d :: OMX_StateLoaded [G722D_INPUT_PORT]->bPopulated  %d \n",
    752                                    __LINE__,pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bPopulated);
    753                     G722DEC_DPRINT("%d :: OMX_StateLoaded [G722D_INPUT_PORT]->bEnabled    %d \n",
    754                                    __LINE__,pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bEnabled);
    755                     G722DEC_DPRINT("%d :: OMX_StateLoaded [G722D_OUTPUT_PORT]->bPopulated %d \n",
    756                                    __LINE__,pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->bPopulated);
    757                     G722DEC_DPRINT("%d :: OMX_StateLoaded [G722D_OUTPUT_PORT]->bEnabled   %d \n",
    758                                    __LINE__,pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->bEnabled);
    759 
    760                     if (pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bPopulated &&
    761                         pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bEnabled)  {
    762                         inputPortFlag = 1;
    763                     }
    764                     if (!pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bPopulated &&
    765                         !pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bEnabled) {
    766                         inputPortFlag = 1;
    767                     }
    768                     if (pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->bPopulated &&
    769                         pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->bEnabled) {
    770                         outputPortFlag = 1;
    771                     }
    772                     if (!pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->bPopulated &&
    773                         !pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->bEnabled) {
    774                         outputPortFlag = 1;
    775                     }
    776                     if (!(inputPortFlag && outputPortFlag)) {
    777                         pComponentPrivate->InLoaded_readytoidle = 1;
    778 #ifndef UNDER_CE
    779                         pthread_mutex_lock(&pComponentPrivate->InLoaded_mutex);
    780                         pthread_cond_wait(&pComponentPrivate->InLoaded_threshold,
    781                                           &pComponentPrivate->InLoaded_mutex);
    782                         pthread_mutex_unlock(&pComponentPrivate->InLoaded_mutex);
    783 #else
    784                         OMX_WaitForEvent(&(pComponentPrivate->InLoaded_event));
    785 #endif
    786                     }
    787 
    788                     pLcmlHandle = (OMX_HANDLETYPE) G722DEC_GetLCMLHandle(pComponentPrivate);
    789                     if (pLcmlHandle == NULL) {
    790                         G722DEC_DPRINT(":: LCML Handle is NULL........exiting..\n");
    791                         pComponentPrivate->curState = OMX_StateInvalid;
    792                         pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
    793                                                                OMX_EventError, OMX_ErrorInvalidState,
    794                                                                0, NULL);
    795                         goto EXIT;
    796                     }
    797 
    798                     pLcmlDsp = (((LCML_DSP_INTERFACE*)pLcmlHandle)->dspCodec);
    799                     eError = G722DEC_Fill_LCMLInitParams(pHandle, pLcmlDsp, arr);
    800                     if(eError != OMX_ErrorNone) {
    801                         G722DEC_DPRINT(":: Error returned from Fill_LCMLInitParams()\n");
    802                         pComponentPrivate->curState = OMX_StateInvalid;
    803                         pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
    804                                                                OMX_EventError, OMX_ErrorInvalidState,
    805                                                                0, NULL);
    806                         goto EXIT;
    807                     }
    808 
    809                     pComponentPrivate->pLcmlHandle = (LCML_DSP_INTERFACE *)pLcmlHandle;
    810                     cb.LCML_Callback = (void *) G722DEC_LCML_Callback;
    811 
    812 #ifndef UNDER_CE
    813                     eError = LCML_InitMMCodecEx(((LCML_DSP_INTERFACE *)pLcmlHandle)->pCodecinterfacehandle,
    814                                                 p,&pLcmlHandle,(void *)p,
    815                                                 &cb,(OMX_STRING)pComponentPrivate->sDeviceString);
    816                     if (eError != OMX_ErrorNone){
    817                         G722DEC_DPRINT("%d :: Error : InitMMCodec failed...>>>>>> \n",__LINE__);
    818                         goto EXIT;
    819                     }
    820 #else
    821                     eError = LCML_InitMMCodec(((LCML_DSP_INTERFACE *)pLcmlHandle)->pCodecinterfacehandle,
    822                                               p,&pLcmlHandle,(void *)p,&cb);
    823                     if (eError != OMX_ErrorNone){
    824                         G722DEC_DPRINT("%d :: Error : InitMMCodec failed...>>>>>> \n",__LINE__);
    825                         goto EXIT;
    826                     }
    827 #endif
    828 
    829 #ifdef HASHINGENABLE
    830                     /* Enable the Hashing Code */
    831                     eError = LCML_SetHashingState(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
    832                                                   OMX_TRUE);
    833                     if (eError != OMX_ErrorNone) {
    834                         G722DEC_DPRINT("Failed to set Mapping State\n");
    835                         goto EXIT;
    836                     }
    837 #endif
    838 
    839 
    840                     G722DEC_DPRINT(":: Control Came Here\n");
    841                     G722DEC_STATEPRINT("****************** Component State Set to Idle\n\n");
    842                     pComponentPrivate->curState = OMX_StateIdle;
    843                     pComponentPrivate->cbInfo.EventHandler(pHandle,
    844                                                            pHandle->pApplicationPrivate,
    845                                                            OMX_EventCmdComplete,
    846                                                            OMX_CommandStateSet,
    847                                                            pComponentPrivate->curState,
    848                                                            NULL);
    849 
    850                     G722DEC_DPRINT("G722DEC: State has been Set to Idle\n");
    851 
    852                 } else if (pComponentPrivate->curState == OMX_StateExecuting) {
    853 #ifdef HASHINGENABLE
    854                     /*Hashing Change*/
    855                     pLcmlHandle = (LCML_DSP_INTERFACE*)pComponentPrivate->pLcmlHandle;
    856                     /* clear out any mappings that might have accumulated */
    857                     eError = LCML_FlushHashes(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle);
    858                     if (eError != OMX_ErrorNone) {
    859                         G722DEC_DPRINT("Error occurred in Codec mapping flush!\n");
    860                         break;
    861                     }
    862 #endif
    863                     pComponentPrivate->bDspStoppedWhileExecuting = OMX_TRUE;
    864                     G722DEC_DPRINT(":: In HandleCommand: Stopping the codec\n");
    865                     eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
    866                                                MMCodecControlStop,(void *)pArgs);
    867                     if(eError != OMX_ErrorNone) {
    868                         G722DEC_DPRINT(": Error Occurred in Codec Stop..\n");
    869                         pComponentPrivate->curState = OMX_StateInvalid;
    870                         pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
    871                                                                OMX_EventError, OMX_ErrorInvalidState,0, NULL);
    872                         goto EXIT;
    873                     }
    874                 } else if(pComponentPrivate->curState == OMX_StatePause) {
    875                     char *pArgs = "damedesuStr";
    876 #ifdef HASHINGENABLE
    877                     /*Hashing Change*/
    878                     pLcmlHandle = (LCML_DSP_INTERFACE*)pComponentPrivate->pLcmlHandle;
    879                     /* clear out any mappings that might have accumulated */
    880                     eError = LCML_FlushHashes(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle);
    881                     if (eError != OMX_ErrorNone) {
    882                         G722DEC_DPRINT("Error occurred in Codec mapping flush!\n");
    883                         break;
    884                     }
    885 #endif
    886                     G722DEC_DPRINT(":: Comp: Stop Command Received\n");
    887                     G722DEC_DPRINT(": G722DECUTILS::About to call LCML_ControlCodec\n");
    888                     eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
    889                                                MMCodecControlStop,(void *)pArgs);
    890                     if(eError != OMX_ErrorNone) {
    891                         G722DEC_DPRINT(": Error Occurred in Codec Stop..\n");
    892                         pComponentPrivate->curState = OMX_StateInvalid;
    893                         pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
    894                                                                OMX_EventError, OMX_ErrorInvalidState,0, NULL);
    895                         goto EXIT;
    896                     }
    897                     G722DEC_STATEPRINT("****************** Component State Set to Idle\n\n");
    898                     pComponentPrivate->curState = OMX_StateIdle;
    899 
    900                     G722DEC_DPRINT ("%d :: The component is stopped\n",__LINE__);
    901                     pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
    902                                                            OMX_EventCmdComplete, OMX_CommandStateSet,
    903                                                            pComponentPrivate->curState, NULL);
    904                 } else {
    905                     G722DEC_DPRINT(": Comp: Sending ErrorNotification: Invalid State\n");
    906                     pComponentPrivate->cbInfo.EventHandler(pHandle,
    907                                                            pHandle->pApplicationPrivate,
    908                                                            OMX_EventError,
    909                                                            OMX_ErrorIncorrectStateTransition, 0,
    910                                                            "Invalid State Error");
    911                 }
    912                 break;
    913 
    914             case OMX_StateExecuting:
    915                 G722DEC_DPRINT(": HandleCommand: Cmd Executing \n");
    916                 if (pComponentPrivate->curState == OMX_StateIdle) {
    917                     char *pArgs = "damedesuStr";
    918                     if(pComponentPrivate->dasfmode == 1) {
    919                         OMX_U32 pValues[4];
    920                         pComponentPrivate->pParams->unUUID = pComponentPrivate->streamID;
    921                         pComponentPrivate->pParams->ulSamplingFreq =
    922                             pComponentPrivate->G722Params[G722D_OUTPUT_PORT]->nSamplingRate;
    923                         pComponentPrivate->pParams->unAudioFormat = 1; /*MONO stream */
    924 
    925                         G722DEC_DPRINT("::pComponentPrivate->pParams->unAudioFormat = %d\n",
    926                                        pComponentPrivate->pParams->unAudioFormat);
    927                         G722DEC_DPRINT("::pComponentPrivate->pParams->ulSamplingFreq = %ld\n",
    928                                        pComponentPrivate->pParams->ulSamplingFreq);
    929                         G722DEC_DPRINT("::pComponentPrivate->pParams->unUUID = %ld\n",
    930                                        pComponentPrivate->pParams->unUUID);
    931 
    932                         pValues[0] = USN_STRMCMD_SETCODECPARAMS;
    933                         pValues[1] = (OMX_U32)pComponentPrivate->pParams;
    934                         pValues[2] = sizeof(G722D_USN_AudioCodecParams);
    935 
    936                         eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
    937                                                    EMMCodecControlStrmCtrl,(void *)pValues);
    938                         if(eError != OMX_ErrorNone) {
    939                             G722DEC_DPRINT(": Error Occurred in Codec StreamControl..\n");
    940                             pComponentPrivate->curState = OMX_StateInvalid;
    941                             pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
    942                                                                    OMX_EventError, OMX_ErrorInvalidState,0, NULL);
    943                             goto EXIT;
    944                         }
    945                     }
    946 
    947                     pComponentPrivate->bDspStoppedWhileExecuting = OMX_FALSE;
    948                     eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
    949                                                EMMCodecControlStart,(void *)pArgs);
    950                     if(eError != OMX_ErrorNone) {
    951                         G722DEC_DPRINT("Error Occurred in Codec Start..\n");
    952                         pComponentPrivate->curState = OMX_StateInvalid;
    953                         pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
    954                                                                OMX_EventError, OMX_ErrorInvalidState,0, NULL);
    955                         goto EXIT;
    956                     }
    957                 } else if (pComponentPrivate->curState == OMX_StatePause) {
    958                     char *pArgs = "damedesuStr";
    959                     G722DEC_DPRINT(": Comp: Resume Command Came from App\n");
    960                     G722DEC_DPRINT(": G722DECUTILS::About to call LCML_ControlCodec\n");
    961                     eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
    962                                                EMMCodecControlStart,(void *)pArgs);
    963                     if (eError != OMX_ErrorNone) {
    964                         G722DEC_DPRINT ("Error While Resuming the codec\n");
    965                         pComponentPrivate->curState = OMX_StateInvalid;
    966                         pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
    967                                                                OMX_EventError, OMX_ErrorInvalidState,0, NULL);
    968                         goto EXIT;
    969                     }
    970 
    971                     for(i=0; i< pComponentPrivate->nPendingOutPausedBufs; i++){
    972                         pComponentPrivate->cbInfo.FillBufferDone( pHandle,
    973                                                                   pHandle->pApplicationPrivate,
    974                                                                   pComponentPrivate->pOutBufHdrWhilePaused[i]);
    975                         pComponentPrivate->nOutStandingFillDones--;
    976                         pComponentPrivate->lcml_nOpBuf--;
    977                         pComponentPrivate->app_nBuf++;
    978                         pComponentPrivate->nFillBufferDoneCount++;
    979 
    980                     }
    981                     pComponentPrivate->nPendingOutPausedBufs = 0;
    982 
    983                     if (pComponentPrivate->nNumInputBufPending < pComponentPrivate->pInputBufferList->numBuffers) {
    984                         pComponentPrivate->nNumInputBufPending = pComponentPrivate->pInputBufferList->numBuffers;
    985                     }
    986                     for (i=0; i < pComponentPrivate->nNumInputBufPending; i++) {
    987                         if (pComponentPrivate->pInputBufHdrPending[i]) {
    988                             G722D_LCML_BUFHEADERTYPE *pLcmlHdr;
    989                             G722DEC_GetCorresponding_LCMLHeader(pComponentPrivate,
    990                                                                 pComponentPrivate->pInputBufHdrPending[i]->pBuffer,
    991                                                                 OMX_DirInput, &pLcmlHdr);
    992                             G722DEC_SetPending(pComponentPrivate,pComponentPrivate->pInputBufHdrPending[i],OMX_DirInput,
    993                                                __LINE__);
    994                             eError = LCML_QueueBuffer(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
    995                                                       EMMCodecInputBuffer,
    996                                                       pComponentPrivate->pInputBufHdrPending[i]->pBuffer,
    997                                                       pComponentPrivate->pInputBufHdrPending[i]->nAllocLen,
    998                                                       pComponentPrivate->pInputBufHdrPending[i]->nFilledLen,
    999                                                       (OMX_U8 *) pLcmlHdr->pIpParam,
   1000                                                       sizeof(G722DEC_ParamStruct),
   1001                                                       NULL);
   1002                         }
   1003                     }
   1004                     pComponentPrivate->nNumInputBufPending = 0;
   1005                     if (pComponentPrivate->nNumOutputBufPending < pComponentPrivate->pOutputBufferList->numBuffers) {
   1006                         pComponentPrivate->nNumOutputBufPending = pComponentPrivate->pOutputBufferList->numBuffers;
   1007                     }
   1008                     for (i=0; i < pComponentPrivate->nNumOutputBufPending; i++) {
   1009                         if (pComponentPrivate->pOutputBufHdrPending[i]) {
   1010                             G722D_LCML_BUFHEADERTYPE *pLcmlHdr;
   1011                             G722DEC_GetCorresponding_LCMLHeader(pComponentPrivate,
   1012                                                                 pComponentPrivate->pOutputBufHdrPending[i]->pBuffer,
   1013                                                                 OMX_DirOutput, &pLcmlHdr);
   1014                             if (!G722DEC_IsPending(pComponentPrivate, pComponentPrivate->pOutputBufHdrPending[i],
   1015                                                    OMX_DirOutput)) {
   1016                                 G722DEC_SetPending(pComponentPrivate,pComponentPrivate->pOutputBufHdrPending[i],
   1017                                                    OMX_DirOutput,__LINE__);
   1018                                 eError = LCML_QueueBuffer(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1019                                                           EMMCodecOuputBuffer,
   1020                                                           pComponentPrivate->pOutputBufHdrPending[i]->pBuffer,
   1021                                                           pComponentPrivate->pOutputBufHdrPending[i]->nAllocLen,
   1022                                                           pComponentPrivate->pOutputBufHdrPending[i]->nFilledLen,
   1023                                                           NULL,
   1024                                                           sizeof(G722DEC_ParamStruct),
   1025                                                           NULL);
   1026                             }
   1027                         }
   1028                     }
   1029                     pComponentPrivate->nNumOutputBufPending = 0;
   1030                 }else {
   1031                     pComponentPrivate->cbInfo.EventHandler (pHandle, pHandle->pApplicationPrivate,
   1032                                                             OMX_EventError, OMX_ErrorIncorrectStateTransition, 0,
   1033                                                             "Invalid State");
   1034                     G722DEC_DPRINT(":: Error: Invalid State Given by \
   1035                        Application\n");
   1036                     goto EXIT;
   1037                 }
   1038 
   1039                 G722DEC_STATEPRINT("****************** Component State Set to Executing\n\n");
   1040                 pComponentPrivate->curState = OMX_StateExecuting;
   1041 
   1042                 pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
   1043                                                        OMX_EventCmdComplete,
   1044                                                        OMX_CommandStateSet, pComponentPrivate->curState, NULL);
   1045                 break;
   1046 
   1047             case OMX_StateLoaded:
   1048                 G722DEC_DPRINT(": HandleCommand: Cmd Loaded\n");
   1049                 if (pComponentPrivate->curState == OMX_StateWaitForResources ){
   1050                     G722DEC_STATEPRINT("***************** Component State Set to Loaded\n\n");
   1051                     pComponentPrivate->curState = OMX_StateLoaded;
   1052                     pComponentPrivate->cbInfo.EventHandler (pHandle, pHandle->pApplicationPrivate,
   1053                                                             OMX_EventCmdComplete, OMX_CommandStateSet,
   1054                                                             pComponentPrivate->curState,
   1055                                                             NULL);
   1056                     G722DEC_DPRINT(":: Tansitioning from WaitFor to Loaded\n");
   1057                     break;
   1058                 }
   1059                 if (pComponentPrivate->curState != OMX_StateIdle) {
   1060                     pComponentPrivate->cbInfo.EventHandler (pHandle, pHandle->pApplicationPrivate,
   1061                                                             OMX_EventError, OMX_ErrorIncorrectStateTransition, 0,
   1062                                                             "Invalid State");
   1063                     G722DEC_DPRINT(":: Error: Invalid State Given by \
   1064                        Application\n");
   1065                     goto EXIT;
   1066                 }
   1067 
   1068                 G722DEC_DPRINT("Current State = %d\n",pComponentPrivate->curState);
   1069                 G722DEC_DPRINT("pComponentPrivate->pInputBufferList->numBuffers = %ld\n",
   1070                                pComponentPrivate->pInputBufferList->numBuffers);
   1071                 G722DEC_DPRINT("pComponentPrivate->pOutputBufferList->numBuffers = %ld\n",
   1072                                pComponentPrivate->pOutputBufferList->numBuffers);
   1073 
   1074                 G722DEC_DPRINT(":: Loaded State - in while(1) loop: ip : %ld : op: %ld\n",
   1075                                pComponentPrivate->pInputBufferList->numBuffers,
   1076                                pComponentPrivate->pOutputBufferList->numBuffers);
   1077                 if (pComponentPrivate->pInputBufferList->numBuffers ||
   1078                     pComponentPrivate->pOutputBufferList->numBuffers) {
   1079                     pComponentPrivate->InIdle_goingtoloaded = 1;
   1080 #ifndef UNDER_CE
   1081                     pthread_mutex_lock(&pComponentPrivate->InIdle_mutex);
   1082                     pthread_cond_wait(&pComponentPrivate->InIdle_threshold,
   1083                                       &pComponentPrivate->InIdle_mutex);
   1084                     pthread_mutex_unlock(&pComponentPrivate->InIdle_mutex);
   1085 
   1086 #else
   1087                     OMX_WaitForEvent(&(pComponentPrivate->InIdle_event));
   1088 #endif
   1089                     pComponentPrivate->bLoadedCommandPending = OMX_FALSE;
   1090                 }
   1091                 /* Now Deinitialize the component No error should be returned from
   1092                  * this function. It should clean the system as much as possible */
   1093                 eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1094                                            EMMCodecControlDestroy,(void *)pArgs);
   1095                 pComponentPrivate->bInitParamsInitialized = 0;
   1096                 eError = EXIT_COMPONENT_THRD;
   1097                 break;
   1098 
   1099             case OMX_StatePause:
   1100                 G722DEC_DPRINT("Cmd Pause: Cur State = %d\n", pComponentPrivate->curState);
   1101 
   1102                 if ((pComponentPrivate->curState != OMX_StateExecuting) &&
   1103                     (pComponentPrivate->curState != OMX_StateIdle)) {
   1104                     pComponentPrivate->cbInfo.EventHandler (pHandle, pHandle->pApplicationPrivate,
   1105                                                             OMX_EventError, OMX_ErrorIncorrectStateTransition, 0,
   1106                                                             "Invalid State");
   1107                     G722DEC_DPRINT(":: Error: Invalid State Given by \
   1108                        Application\n");
   1109                     goto EXIT;
   1110                 }
   1111 
   1112                 G722DEC_DPRINT(": G722DECUTILS::About to call LCML_ControlCodec\n");
   1113                 eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1114                                            EMMCodecControlPause,(void *)pArgs);
   1115 
   1116                 if (eError != OMX_ErrorNone) {
   1117                     G722DEC_DPRINT(": Error: in Pausing the codec\n");
   1118                     pComponentPrivate->curState = OMX_StateInvalid;
   1119                     pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
   1120                                                            OMX_EventError, OMX_ErrorInvalidState,0, NULL);
   1121                     goto EXIT;
   1122                 }
   1123                 G722DEC_DPRINT(":: Component: Codec Is Paused\n");
   1124 
   1125                 G722DEC_STATEPRINT("****************** Component State Set to Pause\n\n");
   1126                 pComponentPrivate->curState = OMX_StatePause;
   1127                 pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
   1128                                                        OMX_EventCmdComplete, OMX_CommandStateSet,
   1129                                                        pComponentPrivate->curState, NULL);
   1130                 break;
   1131 
   1132             case OMX_StateWaitForResources:
   1133                 G722DEC_DPRINT(": HandleCommand: Cmd : OMX_StateWaitForResources\n");
   1134                 if (pComponentPrivate->curState == OMX_StateLoaded) {
   1135                     pComponentPrivate->curState = OMX_StateWaitForResources;
   1136                     G722DEC_DPRINT(": Transitioning from Loaded to OMX_StateWaitForResources\n");
   1137                     pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
   1138                                                            OMX_EventCmdComplete,
   1139                                                            OMX_CommandStateSet,pComponentPrivate->curState, NULL);
   1140                 } else {
   1141                     pComponentPrivate->cbInfo.EventHandler(
   1142                                                            pHandle, pHandle->pApplicationPrivate,
   1143                                                            OMX_EventError, OMX_ErrorIncorrectStateTransition,0, NULL);
   1144                 }
   1145                 break;
   1146 
   1147             case OMX_StateInvalid:
   1148                 G722DEC_DPRINT(": HandleCommand: Cmd OMX_StateInvalid:\n");
   1149                 pComponentPrivate->curState = OMX_StateInvalid;
   1150 
   1151                 pComponentPrivate->cbInfo.EventHandler(
   1152                                                        pHandle, pHandle->pApplicationPrivate,
   1153                                                        OMX_EventError, OMX_ErrorInvalidState,0, NULL);
   1154                 break;
   1155 
   1156             case OMX_StateMax:
   1157                 G722DEC_DPRINT(": HandleCommand: Cmd OMX_StateMax::\n");
   1158                 break;
   1159             } /* End of Switch */
   1160         }
   1161     }
   1162     else if (command == OMX_CommandMarkBuffer) {
   1163         G722DEC_DPRINT("command OMX_CommandMarkBuffer received\n");
   1164         if(!pComponentPrivate->pMarkBuf){
   1165             G722DEC_DPRINT("command OMX_CommandMarkBuffer received \n");
   1166             pComponentPrivate->pMarkBuf = (OMX_MARKTYPE *)(commandData);
   1167         }
   1168     }
   1169     else if (command == OMX_CommandPortDisable) {
   1170         if (!pComponentPrivate->bDisableCommandPending) {
   1171             if(commandData == 0x0){
   1172                 /* disable port */
   1173                 for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) {
   1174                     if (G722DEC_IsPending(pComponentPrivate,pComponentPrivate->pInputBufferList->pBufHdr[i],
   1175                                           OMX_DirInput)) {
   1176                         /* Real solution is flush buffers from DSP.  Until we have the ability to do that
   1177                            we just call EmptyBufferDone() on any pending buffers */
   1178                         pComponentPrivate->cbInfo.EmptyBufferDone (pComponentPrivate->pHandle,
   1179                                                                    pComponentPrivate->pHandle->pApplicationPrivate,
   1180                                                                    pComponentPrivate->pInputBufferList->pBufHdr[i]);
   1181                         pComponentPrivate->nEmptyBufferDoneCount++;
   1182                     }
   1183                 }
   1184                 pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bEnabled = OMX_FALSE;
   1185             }
   1186             if(commandData == -1){
   1187                 pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bEnabled = OMX_FALSE;
   1188             }
   1189             if(commandData == 0x1 || commandData == -1){
   1190                 char *pArgs = "damedesuStr";
   1191                 pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->bEnabled = OMX_FALSE;
   1192                 if (pComponentPrivate->curState == OMX_StateExecuting) {
   1193                     pComponentPrivate->bNoIdleOnStop = OMX_TRUE;
   1194                     eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1195                                                MMCodecControlStop,(void *)pArgs);
   1196                 }
   1197             }
   1198         }
   1199         G722DEC_DPRINT("commandData = %ld\n",commandData);
   1200         G722DEC_DPRINT("pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bPopulated = %d\n",
   1201                        pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bPopulated);
   1202         G722DEC_DPRINT("pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->bPopulated = %d\n",
   1203                        pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->bPopulated);
   1204         if(commandData == 0x0) {
   1205             if(!pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bPopulated){
   1206                 /* return cmdcomplete event if input unpopulated */
   1207                 pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
   1208                                                        OMX_EventCmdComplete, OMX_CommandPortDisable,
   1209                                                        G722D_INPUT_PORT, NULL);
   1210                 pComponentPrivate->bDisableCommandPending = 0;
   1211             }
   1212             else{
   1213                 pComponentPrivate->bDisableCommandPending = 1;
   1214                 pComponentPrivate->bDisableCommandParam = commandData;
   1215             }
   1216         }
   1217         if(commandData == 0x1) {
   1218             if (!pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->bPopulated){
   1219                 /* return cmdcomplete event if output unpopulated */
   1220                 pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
   1221                                                        OMX_EventCmdComplete, OMX_CommandPortDisable,
   1222                                                        G722D_OUTPUT_PORT, NULL);
   1223                 pComponentPrivate->bDisableCommandPending = 0;
   1224             }
   1225             else {
   1226                 pComponentPrivate->bDisableCommandPending = 1;
   1227                 pComponentPrivate->bDisableCommandParam = commandData;
   1228             }
   1229         }
   1230         if(commandData == -1) {
   1231             if (!pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bPopulated &&
   1232                 !pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->bPopulated){
   1233                 /* return cmdcomplete event if inout & output unpopulated */
   1234                 pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
   1235                                                        OMX_EventCmdComplete, OMX_CommandPortDisable,
   1236                                                        G722D_INPUT_PORT, NULL);
   1237                 pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
   1238                                                        OMX_EventCmdComplete, OMX_CommandPortDisable,
   1239                                                        G722D_OUTPUT_PORT, NULL);
   1240                 pComponentPrivate->bDisableCommandPending = 0;
   1241             }
   1242             else {
   1243                 pComponentPrivate->bDisableCommandPending = 1;
   1244                 pComponentPrivate->bDisableCommandParam = commandData;
   1245             }
   1246 #ifndef UNDER_CE
   1247             sched_yield();
   1248 #else
   1249             Sleep(0);
   1250 #endif
   1251         }
   1252     }
   1253     else if (command == OMX_CommandPortEnable) {
   1254         if(commandData == 0x0 || commandData == -1){
   1255             /* enable in port */
   1256             G722DEC_DPRINT("setting input port to enabled\n");
   1257             pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bEnabled = OMX_TRUE;
   1258             G722DEC_DPRINT("pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bEnabled = %d\n",
   1259                            pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bEnabled);
   1260 
   1261             if(pComponentPrivate->AlloBuf_waitingsignal){
   1262                 pComponentPrivate->AlloBuf_waitingsignal = 0;
   1263 #ifndef UNDER_CE
   1264                 pthread_mutex_lock(&pComponentPrivate->AlloBuf_mutex);
   1265                 pthread_cond_signal(&pComponentPrivate->AlloBuf_threshold);
   1266                 pthread_mutex_unlock(&pComponentPrivate->AlloBuf_mutex);
   1267 #else
   1268                 OMX_SignalEvent(&(pComponentPrivate->AlloBuf_event));
   1269 #endif
   1270             }
   1271         }
   1272         if(commandData == 0x1 || commandData == -1){
   1273             char *pArgs = "damedesuStr";
   1274             /* enable out port */
   1275             G722DEC_DPRINT("setting output port to enabled\n");
   1276             pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->bEnabled = OMX_TRUE;
   1277             if(pComponentPrivate->AlloBuf_waitingsignal){
   1278                 pComponentPrivate->AlloBuf_waitingsignal = 0;
   1279 #ifndef UNDER_CE
   1280                 pthread_mutex_lock(&pComponentPrivate->AlloBuf_mutex);
   1281                 pthread_cond_signal(&pComponentPrivate->AlloBuf_threshold);
   1282                 pthread_mutex_unlock(&pComponentPrivate->AlloBuf_mutex);
   1283 #else
   1284                 OMX_SignalEvent(&(pComponentPrivate->AlloBuf_event));
   1285 #endif
   1286             }
   1287             if(pComponentPrivate->curState == OMX_StateExecuting){
   1288                 pComponentPrivate->bDspStoppedWhileExecuting = OMX_FALSE;
   1289                 eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1290                                            EMMCodecControlStart,(void *)pArgs);
   1291             }
   1292             G722DEC_DPRINT("pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->bEnabled = %d\n",
   1293                            pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->bEnabled);
   1294         }
   1295         while (1) {
   1296             G722DEC_DPRINT("commandData = %ld\n",commandData);
   1297             G722DEC_DPRINT("pComponentPrivate->curState = %d\n",pComponentPrivate->curState);
   1298             G722DEC_DPRINT("pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bPopulated = %d\n",
   1299                            pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bPopulated);
   1300 
   1301             if(commandData == 0x0 && (pComponentPrivate->curState == OMX_StateLoaded ||
   1302                                       pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bPopulated)){
   1303 
   1304                 pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
   1305                                                        OMX_EventCmdComplete,
   1306                                                        OMX_CommandPortEnable,G722D_INPUT_PORT,
   1307                                                        NULL);
   1308                 break;
   1309             }
   1310             else if(commandData == 0x1 && (pComponentPrivate->curState == OMX_StateLoaded ||
   1311                                            pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->bPopulated)){
   1312 
   1313                 pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
   1314                                                        OMX_EventCmdComplete,
   1315                                                        OMX_CommandPortEnable,G722D_OUTPUT_PORT,
   1316                                                        NULL);
   1317                 break;
   1318             }
   1319             else if(commandData == -1 && (pComponentPrivate->curState == OMX_StateLoaded ||
   1320                                           (pComponentPrivate->pPortDef[G722D_INPUT_PORT]->bPopulated &&
   1321                                            pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->bPopulated))) {
   1322 
   1323                 pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
   1324                                                        OMX_EventCmdComplete, OMX_CommandPortEnable,
   1325                                                        G722D_INPUT_PORT,
   1326                                                        NULL);
   1327 
   1328                 pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
   1329                                                        OMX_EventCmdComplete, OMX_CommandPortEnable,
   1330                                                        G722D_OUTPUT_PORT,
   1331                                                        NULL);
   1332                 G722DECFill_LCMLInitParamsEx(pComponentPrivate->pHandle);
   1333                 break;
   1334             }
   1335 #ifndef UNDER_CE
   1336             sched_yield();
   1337 #else
   1338             Sleep(0);
   1339 #endif
   1340         }
   1341     }
   1342     else if (command == OMX_CommandFlush) {
   1343         int j=0;
   1344         G722DEC_DPRINT(":: Inside OMX_CommandFlush Command\n");
   1345         if(commandData == 0x0 || commandData == -1) {
   1346             for (i=0; i < MAX_NUM_OF_BUFS; i++) {
   1347                 pComponentPrivate->pInputBufHdrPending[i] = NULL;
   1348             }
   1349             pComponentPrivate->nNumInputBufPending=0;
   1350             for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) {
   1351                 numCalls = pComponentPrivate->nEmptyThisBufferCount - pComponentPrivate->nEmptyBufferDoneCount;
   1352                 if (numCalls > 0) {
   1353                     for (j=0; j < numCalls; j++) {
   1354                         pComponentPrivate->cbInfo.EmptyBufferDone (pComponentPrivate->pHandle,
   1355                                                                    pComponentPrivate->pHandle->pApplicationPrivate,
   1356                                                                    pComponentPrivate->pInputBufferList->pBufHdr[i]
   1357                                                                    );
   1358                         pComponentPrivate->nEmptyBufferDoneCount++;
   1359 
   1360                     }
   1361                 }
   1362             }
   1363             /* return all input buffers */
   1364             pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
   1365                                                    OMX_EventCmdComplete, OMX_CommandFlush,G722D_INPUT_PORT, NULL);
   1366         }
   1367         if(commandData == 0x1 || commandData == -1){
   1368             G722DEC_DPRINT("Flusing output queue\n");
   1369             for (i=0; i < MAX_NUM_OF_BUFS; i++) {
   1370                 pComponentPrivate->pOutputBufHdrPending[i] = NULL;
   1371             }
   1372             pComponentPrivate->nNumOutputBufPending=0;
   1373             /* return all output buffers */
   1374             for (i=0; i < pComponentPrivate->pOutputBufferList->numBuffers; i++) {
   1375                 pComponentPrivate->cbInfo.FillBufferDone (pComponentPrivate->pHandle,
   1376                                                           pComponentPrivate->pHandle->pApplicationPrivate,
   1377                                                           pComponentPrivate->pOutputBufferList->pBufHdr[i]);
   1378                 pComponentPrivate->nFillBufferDoneCount++;
   1379 
   1380             }
   1381             pComponentPrivate->cbInfo.EventHandler(pHandle, pHandle->pApplicationPrivate,
   1382                                                    OMX_EventCmdComplete, OMX_CommandFlush,G722D_OUTPUT_PORT, NULL);
   1383         }
   1384     }
   1385  EXIT:
   1386     G722DEC_DPRINT (":: Exiting HandleCommand Function\n");
   1387     return eError;
   1388 }
   1389 
   1390 
   1391 
   1392 /* ================================================================================= * */
   1393 /**
   1394  * @fn G722DEC_HandleDataBuf_FromApp() function handles the input and output buffers
   1395  * that come from the application. It is not direct function wich gets called by
   1396  * the application rather, it gets called eventually.
   1397  *
   1398  * @param *pBufHeader This is the buffer header that needs to be processed.
   1399  *
   1400  * @param *pComponentPrivate  This is component's private date structure.
   1401  *
   1402  * @pre          None
   1403  *
   1404  * @post         None
   1405  *
   1406  *  @return      OMX_ErrorNone = Successful processing.
   1407  *               OMX_ErrorInsufficientResources = Not enough memory
   1408  *               OMX_ErrorHardware = Hardware error has occured lile LCML failed
   1409  *               to do any said operartion.
   1410  *
   1411  *  @see         None
   1412  */
   1413 /* ================================================================================ * */
   1414 OMX_ERRORTYPE G722DEC_HandleDataBuf_FromApp(OMX_BUFFERHEADERTYPE* pBufHeader,
   1415                                             G722DEC_COMPONENT_PRIVATE *pComponentPrivate)
   1416 {
   1417     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1418     OMX_DIRTYPE eDir;
   1419     G722DEC_DPRINT (":: Entering HandleDataBuf_FromApp Function\n");
   1420     G722DEC_DPRINT (":: pBufHeader->pMarkData = %p\n",pBufHeader->pMarkData);
   1421 
   1422     pBufHeader->pPlatformPrivate  = pComponentPrivate;
   1423     eError = G722DEC_GetBufferDirection(pBufHeader, &eDir);
   1424     G722DEC_DPRINT (":: HandleDataBuf_FromApp Function\n");
   1425     if (eError != OMX_ErrorNone) {
   1426         G722DEC_DPRINT (":: The pBufHeader is not found in the list\n");
   1427         goto EXIT;
   1428     }
   1429 
   1430     if (eDir == OMX_DirInput) {
   1431         LCML_DSP_INTERFACE *pLcmlHandle = (LCML_DSP_INTERFACE *)pComponentPrivate->pLcmlHandle;
   1432         G722D_LCML_BUFHEADERTYPE *pLcmlHdr;
   1433 
   1434         eError = G722DEC_GetCorresponding_LCMLHeader(pComponentPrivate,
   1435                                                      pBufHeader->pBuffer, OMX_DirInput, &pLcmlHdr);
   1436         if (eError != OMX_ErrorNone) {
   1437             G722DEC_DPRINT(":: Error: Invalid Buffer Came ...\n");
   1438             goto EXIT;
   1439         }
   1440 
   1441         /* Store time stamp information */
   1442         pComponentPrivate->arrTimestamp[pComponentPrivate->IpBufindex] = pBufHeader->nTimeStamp;
   1443         /* Store nTickCount information */
   1444         pComponentPrivate->arrTickCount[pComponentPrivate->IpBufindex] = pBufHeader->nTickCount;
   1445         pComponentPrivate->IpBufindex++;
   1446         pComponentPrivate->IpBufindex %= pComponentPrivate->pPortDef[OMX_DirInput]->nBufferCountActual;
   1447 
   1448         if (pBufHeader->nFilledLen > 0 || pBufHeader->nFlags == OMX_BUFFERFLAG_EOS) {
   1449             pComponentPrivate->bBypassDSP = 0;
   1450             G722DEC_DPRINT (":: HandleDataBuf_FromApp Function\n");
   1451             G722DEC_DPRINT (":::Calling LCML_QueueBuffer\n");
   1452 
   1453             pLcmlHdr->pIpParam->usLastFrame = 0;
   1454             if(pBufHeader->nFlags == OMX_BUFFERFLAG_EOS) {
   1455                 G722DEC_DPRINT(":: usLastFrame Is Set Here....\n");
   1456                 pLcmlHdr->pIpParam->usLastFrame = 1;
   1457                 pComponentPrivate->bIsEOFSent = 1;
   1458                 pBufHeader->nFlags = 0;
   1459             }
   1460 
   1461             G722DEC_DPRINT ("Comp:: Sending Filled Input buffer = %p, %p to LCML\n",pBufHeader,pBufHeader->pBuffer);
   1462 
   1463             /* Store time stamp information */
   1464             pComponentPrivate->arrTimestamp[pComponentPrivate->IpBufindex] = pBufHeader->nTimeStamp;
   1465             pComponentPrivate->arrTickCount[pComponentPrivate->IpBufindex] = pBufHeader->nTickCount;
   1466             pComponentPrivate->IpBufindex++;
   1467             pComponentPrivate->IpBufindex %= pComponentPrivate->pPortDef[G722D_INPUT_PORT]->nBufferCountActual;
   1468             if (pComponentPrivate->curState == OMX_StateExecuting) {
   1469                 if (!G722DEC_IsPending(pComponentPrivate,pBufHeader,OMX_DirInput)) {
   1470                     if(!pComponentPrivate->bDspStoppedWhileExecuting) {
   1471                         G722DEC_SetPending(pComponentPrivate,pBufHeader,OMX_DirInput,__LINE__);
   1472                         eError = LCML_QueueBuffer(pLcmlHandle->pCodecinterfacehandle,
   1473                                                   EMMCodecInputBuffer,
   1474                                                   pBufHeader->pBuffer,
   1475                                                   pBufHeader->nAllocLen,
   1476                                                   pBufHeader->nFilledLen,
   1477                                                   (OMX_U8 *) pLcmlHdr->pIpParam,
   1478                                                   sizeof(G722DEC_ParamStruct),
   1479                                                   pBufHeader->pBuffer);
   1480                         if (eError != OMX_ErrorNone) {
   1481                             G722DEC_DPRINT ("::Comp: SetBuff: IP: Error Occurred\n");
   1482                             eError = OMX_ErrorHardware;
   1483                             goto EXIT;
   1484                         }
   1485 
   1486                         pComponentPrivate->lcml_nCntIp++;
   1487                         pComponentPrivate->lcml_nIpBuf++;
   1488                         pComponentPrivate->num_Sent_Ip_Buff++;
   1489                         G722DEC_DPRINT ("Sending Input buffer to Codec\n");
   1490                     }
   1491                     else {
   1492                         G722DEC_DPRINT("Calling EmptyBufferDone from line %d\n",__LINE__);
   1493                         pComponentPrivate->cbInfo.EmptyBufferDone (pComponentPrivate->pHandle,
   1494                                                                    pComponentPrivate->pHandle->pApplicationPrivate,
   1495                                                                    pBufHeader );
   1496                     }
   1497 
   1498                 }
   1499             } else if (pComponentPrivate->curState == OMX_StatePause) {
   1500                 pComponentPrivate->pInputBufHdrPending[pComponentPrivate->nNumInputBufPending++] = pBufHeader;
   1501             }
   1502         } else {
   1503             pComponentPrivate->bBypassDSP = 1;
   1504             G722DEC_DPRINT ("Forcing EmptyBufferDone\n");
   1505             if(pComponentPrivate->dasfmode == 0) {
   1506                 pComponentPrivate->cbInfo.EmptyBufferDone (pComponentPrivate->pHandle,
   1507                                                            pComponentPrivate->pHandle->pApplicationPrivate,
   1508                                                            pComponentPrivate->pInputBufferList->pBufHdr[0]);
   1509                 pComponentPrivate->nEmptyBufferDoneCount++;
   1510             }
   1511         }
   1512         if(pBufHeader->pMarkData){
   1513             G722DEC_DPRINT (":Detected pBufHeader->pMarkData\n");
   1514             pComponentPrivate->pMarkData = pBufHeader->pMarkData;
   1515             pComponentPrivate->hMarkTargetComponent = pBufHeader->hMarkTargetComponent;
   1516             pComponentPrivate->pOutputBufferList->pBufHdr[0]->pMarkData = pBufHeader->pMarkData;
   1517             pComponentPrivate->pOutputBufferList->pBufHdr[0]->hMarkTargetComponent = pBufHeader->hMarkTargetComponent;
   1518             if(pBufHeader->hMarkTargetComponent == pComponentPrivate->pHandle && pBufHeader->pMarkData){
   1519                 pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   1520                                                        pComponentPrivate->pHandle->pApplicationPrivate,
   1521                                                        OMX_EventMark,
   1522                                                        0,
   1523                                                        0,
   1524                                                        pBufHeader->pMarkData);
   1525             }
   1526         }
   1527     }
   1528     else if (eDir == OMX_DirOutput) {
   1529         LCML_DSP_INTERFACE *pLcmlHandle = (LCML_DSP_INTERFACE *)pComponentPrivate->pLcmlHandle;
   1530         G722D_LCML_BUFHEADERTYPE *pLcmlHdr = NULL;
   1531 
   1532         G722DEC_DPRINT(": pComponentPrivate->lcml_nOpBuf = %ld\n",
   1533                        pComponentPrivate->lcml_nOpBuf);
   1534         G722DEC_DPRINT(": pComponentPrivate->lcml_nIpBuf = %ld\n",
   1535                        pComponentPrivate->lcml_nIpBuf);
   1536         eError = G722DEC_GetCorresponding_LCMLHeader(pComponentPrivate,pBufHeader->pBuffer, OMX_DirOutput, &pLcmlHdr);
   1537         if (eError != OMX_ErrorNone) {
   1538             G722DEC_DPRINT(":: Error: Invalid Buffer Came ...\n");
   1539             goto EXIT;
   1540         }
   1541 
   1542         G722DEC_DPRINT (":::Calling LCML_QueueBuffer\n");
   1543         if (pComponentPrivate->bBypassDSP == 0) {
   1544             G722DEC_DPRINT ("Comp:: Sending Emptied Output buffer=%p to LCML\n",pBufHeader);
   1545             if (pComponentPrivate->curState == OMX_StateExecuting) {
   1546                 G722DEC_DPRINT ("Comp:: in G722DEC UTILS pLcmlHandle->pCodecinterfacehandle= %p\n",
   1547                                 pLcmlHandle->pCodecinterfacehandle);
   1548                 G722DEC_DPRINT ("Comp:: in G722DEC UTILS EMMCodecOuputBuffer = %d\n",EMMCodecOuputBuffer);
   1549                 G722DEC_DPRINT ("Comp:: in G722DEC UTILS pBufHeader->pBuffer = %p\n",pBufHeader->pBuffer);
   1550                 G722DEC_DPRINT ("Comp:: in G722DEC UTILS pBufHeader->nAllocLen = %ld\n",pBufHeader->nAllocLen);
   1551                 if (!G722DEC_IsPending(pComponentPrivate,pBufHeader,OMX_DirOutput) &&
   1552                     (pComponentPrivate->numPendingBuffers < pComponentPrivate->pOutputBufferList->numBuffers))  {
   1553                     G722DEC_SetPending(pComponentPrivate,pBufHeader,OMX_DirOutput,__LINE__);
   1554                     if(!pComponentPrivate->bDspStoppedWhileExecuting){
   1555                         eError = LCML_QueueBuffer(pLcmlHandle->pCodecinterfacehandle,
   1556                                                   EMMCodecOuputBuffer,
   1557                                                   pBufHeader->pBuffer,
   1558                                                   pBufHeader->nAllocLen,
   1559                                                   0,
   1560                                                   NULL,
   1561                                                   sizeof(G722DEC_ParamStruct),
   1562                                                   pBufHeader->pBuffer);
   1563                         if (eError != OMX_ErrorNone ) {
   1564                             G722DEC_DPRINT (":: Comp:: SetBuff OP: Error Occurred\n");
   1565                             eError = OMX_ErrorHardware;
   1566                             goto EXIT;
   1567                         }
   1568                         pComponentPrivate->lcml_nCntOp++;
   1569                         pComponentPrivate->lcml_nOpBuf++;
   1570                         pComponentPrivate->num_Op_Issued++;
   1571                         G722DEC_DPRINT ("Comp:: in G722DEC UTILS \n");
   1572                     }
   1573                 }
   1574             } else {
   1575                 pComponentPrivate->pOutputBufHdrPending[pComponentPrivate->nNumOutputBufPending++] = pBufHeader;
   1576             }
   1577         }
   1578     } /* end of OMX_DirOutput if struct */
   1579     else {
   1580         G722DEC_DPRINT(": BufferHeader %p, Buffer %p Unknown ..........\n",pBufHeader, pBufHeader->pBuffer);
   1581         eError = OMX_ErrorBadParameter;
   1582     }
   1583  EXIT:
   1584     G722DEC_DPRINT(": Exiting from  HandleDataBuf_FromApp: %x \n",eError);
   1585     if(eError == OMX_ErrorBadParameter) {
   1586         G722DEC_DPRINT(": Error = OMX_ErrorBadParameter\n");
   1587     }
   1588     return eError;
   1589 }
   1590 
   1591 
   1592 /* ================================================================================= * */
   1593 /**
   1594  * @fn G722DEC_GetBufferDirection() function determines whether it is input buffer or
   1595  * output buffer.
   1596  *
   1597  * @param *pBufHeader This is pointer to buffer header whose direction needs to
   1598  *                    be determined.
   1599  *
   1600  * @param *eDir  This is output argument which stores the direction of buffer.
   1601  *
   1602  * @pre          None
   1603  *
   1604  * @post         None
   1605  *
   1606  *  @return      OMX_ErrorNone = Successful processing.
   1607  *               OMX_ErrorBadParameter = In case of invalid buffer
   1608  *
   1609  *  @see         None
   1610  */
   1611 /* ================================================================================ * */
   1612 
   1613 OMX_ERRORTYPE G722DEC_GetBufferDirection(OMX_BUFFERHEADERTYPE *pBufHeader,
   1614                                          OMX_DIRTYPE *eDir)
   1615 {
   1616     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1617     G722DEC_COMPONENT_PRIVATE *pComponentPrivate = pBufHeader->pPlatformPrivate;
   1618     OMX_U32 nBuf = pComponentPrivate->pInputBufferList->numBuffers;
   1619     OMX_BUFFERHEADERTYPE *pBuf = NULL;
   1620     int flag = 1;
   1621     OMX_U32 i=0;
   1622 
   1623     G722DEC_DPRINT (":: Entering GetBufferDirection Function\n");
   1624     for(i=0; i<nBuf; i++) {
   1625         pBuf = pComponentPrivate->pInputBufferList->pBufHdr[i];
   1626         if(pBufHeader == pBuf) {
   1627             *eDir = OMX_DirInput;
   1628             G722DEC_DPRINT (":: Buffer %p is INPUT BUFFER\n", pBufHeader);
   1629             flag = 0;
   1630             goto EXIT;
   1631         }
   1632     }
   1633 
   1634     nBuf = pComponentPrivate->pOutputBufferList->numBuffers;
   1635 
   1636     for(i=0; i<nBuf; i++) {
   1637         pBuf = pComponentPrivate->pOutputBufferList->pBufHdr[i];
   1638         if(pBufHeader == pBuf) {
   1639             *eDir = OMX_DirOutput;
   1640             G722DEC_DPRINT (":: Buffer %p is OUTPUT BUFFER\n", pBufHeader);
   1641             flag = 0;
   1642             goto EXIT;
   1643         }
   1644     }
   1645 
   1646     if (flag == 1) {
   1647         G722D_OMX_ERROR_EXIT(eError, OMX_ErrorBadParameter,
   1648                              "Buffer Not Found in List : OMX_ErrorBadParameter");
   1649     }
   1650  EXIT:
   1651     G722DEC_DPRINT (":: Exiting GetBufferDirection Function\n");
   1652     return eError;
   1653 }
   1654 
   1655 /* ================================================================================= * */
   1656 /**
   1657  * @fn G722DEC_LCML_Callback() function is callback which is called by LCML whenever
   1658  * there is an even generated for the component.
   1659  *
   1660  * @param event  This is event that was generated.
   1661  *
   1662  * @param arg    This has other needed arguments supplied by LCML like handles
   1663  *               etc.
   1664  *
   1665  * @pre          None
   1666  *
   1667  * @post         None
   1668  *
   1669  *  @return      OMX_ErrorNone = Successful processing.
   1670  *               OMX_ErrorInsufficientResources = Not enough memory
   1671  *
   1672  *  @see         None
   1673  */
   1674 /* ================================================================================ * */
   1675 OMX_ERRORTYPE G722DEC_LCML_Callback (TUsnCodecEvent event,void * args [10])
   1676 {
   1677     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1678     OMX_U8 *pBuffer = args[1];
   1679     G722D_LCML_BUFHEADERTYPE *pLcmlHdr = NULL;
   1680     OMX_COMPONENTTYPE *pHandle = NULL;
   1681     LCML_DSP_INTERFACE *pLcmlHandle = NULL;
   1682     G722DEC_COMPONENT_PRIVATE* pComponentPrivate = NULL;
   1683     pComponentPrivate = (G722DEC_COMPONENT_PRIVATE*)
   1684         ((LCML_DSP_INTERFACE*)args[6])->pComponentPrivate;
   1685     G722DEC_DPRINT("Component private handle: pComponentPrivate = %p\n",pComponentPrivate);
   1686     G722DEC_DPRINT (":: Entering the LCML_Callback() : event = %d\n",event);
   1687 
   1688 #ifdef G722DEC_DEBUG
   1689     printEmmEvent (event);
   1690 #endif
   1691 
   1692     if(event == EMMCodecBufferProcessed){
   1693         G722DEC_DPRINT(":: --------- EMMCodecBufferProcessed Here\n");
   1694         if( args[0] == (void *)EMMCodecInputBuffer) {
   1695             G722DEC_DPRINT (" :: Inside the LCML_Callback EMMCodecInputBuffer\n");
   1696             G722DEC_DPRINT(":: Input: pBufferr = %p\n", pBuffer);
   1697 
   1698             eError = G722DEC_GetCorresponding_LCMLHeader(pComponentPrivate,pBuffer, OMX_DirInput, &pLcmlHdr);
   1699             G722DEC_DPRINT(":: Output: pLcmlHeader = %p\n", pLcmlHdr);
   1700             G722DEC_DPRINT(":: Output: pLcmlHdr->eDir = %d\n", pLcmlHdr->eDir);
   1701             G722DEC_DPRINT(":: Output: *pLcmlHdr->eDir = %d\n", pLcmlHdr->eDir);
   1702             G722DEC_DPRINT(":: Output: Filled Len = %ld\n", pLcmlHdr->pBufHdr->nFilledLen);
   1703             if (eError != OMX_ErrorNone) {
   1704                 G722DEC_DPRINT(":: Error: Invalid Buffer Came ...\n");
   1705                 goto EXIT;
   1706             }
   1707             G722DEC_DPRINT(":: Input: pLcmlHeader = %p\n", pLcmlHdr);
   1708 
   1709             pComponentPrivate->lcml_nCntIpRes++;
   1710 
   1711             G722DEC_ClearPending(pComponentPrivate,pLcmlHdr->pBufHdr,OMX_DirInput,__LINE__);
   1712             /* >>>>>>>>>>>>>>>>>>>>> */
   1713             G722DEC_DPRINT(": Component Sending Empty Input buffer%p to App\n", pLcmlHdr->pBufHdr->pBuffer);
   1714             pComponentPrivate->cbInfo.EmptyBufferDone (pComponentPrivate->pHandle,
   1715                                                        pComponentPrivate->pHandle->pApplicationPrivate,
   1716                                                        pLcmlHdr->pBufHdr );
   1717             pComponentPrivate->nEmptyBufferDoneCount++;
   1718             pComponentPrivate->lcml_nIpBuf--;
   1719             pComponentPrivate->app_nBuf++;
   1720             /* <<<<<<<<<<<<<<<<<<<<< */
   1721         } else if (args[0] == (void *)EMMCodecOuputBuffer) {
   1722             G722DEC_DPRINT (" :: Inside the LCML_Callback EMMCodecOuputBuffer\n");
   1723             G722DEC_DPRINT(":: Output: pBuffer = %p\n", pBuffer);
   1724             if (!G722DEC_IsValid(pComponentPrivate,pBuffer,OMX_DirOutput)) {
   1725                 /* If the buffer we get back from the DSP is not valid call FillBufferDone
   1726                    on a valid buffer */
   1727                 pComponentPrivate->cbInfo.FillBufferDone (pComponentPrivate->pHandle,
   1728                                                           pComponentPrivate->pHandle->pApplicationPrivate,
   1729                                                           pComponentPrivate->pOutputBufferList->pBufHdr[pComponentPrivate->nInvalidFrameCount++]);
   1730                 pComponentPrivate->nOutStandingFillDones--;
   1731                 pComponentPrivate->numPendingBuffers--;
   1732             }
   1733             else {
   1734                 pComponentPrivate->nOutStandingFillDones++;
   1735                 eError = G722DEC_GetCorresponding_LCMLHeader(pComponentPrivate,pBuffer, OMX_DirOutput, &pLcmlHdr);
   1736                 if (eError != OMX_ErrorNone) {
   1737                     G722DEC_DPRINT(":: Error: Invalid Buffer Came ...\n");
   1738                     goto EXIT;
   1739                 }
   1740                 pLcmlHdr->pBufHdr->nFilledLen = (int)args[8];
   1741                 G722DEC_DPRINT(":: Output: pLcmlHeader = %p\n", pLcmlHdr);
   1742                 G722DEC_DPRINT(":: Output: pLcmlHdr->eDir = %d\n", pLcmlHdr->eDir);
   1743                 G722DEC_DPRINT(":: Output: Filled Len = %ld\n", pLcmlHdr->pBufHdr->nFilledLen);
   1744                 pComponentPrivate->lcml_nCntOpReceived++;
   1745                 G722DEC_ClearPending(pComponentPrivate,pLcmlHdr->pBufHdr,OMX_DirOutput,__LINE__);
   1746                 /* >>>>>>>>>>>>>>>>>>>>> */
   1747                 G722DEC_DPRINT ("Sending Output buffer to Applcation\n");
   1748                 if (pComponentPrivate->bIsEOFSent){
   1749                     G722DEC_DPRINT ("Adding EOS flag to the output buffer\n");
   1750                     pLcmlHdr->pBufHdr->nFlags |= OMX_BUFFERFLAG_EOS;
   1751                     pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   1752                                                            pComponentPrivate->pHandle->pApplicationPrivate,
   1753                                                            OMX_EventBufferFlag,
   1754                                                            pLcmlHdr->pBufHdr->nOutputPortIndex,
   1755                                                            pLcmlHdr->pBufHdr->nFlags, NULL);
   1756                     pComponentPrivate->bIsEOFSent = 0;
   1757                 }
   1758                 if (pComponentPrivate->pMarkData) {
   1759                     G722DEC_DPRINT ("pComponentPrivate->pMarkData set\n");
   1760                     pLcmlHdr->pBufHdr->pMarkData = pComponentPrivate->pMarkData;
   1761                     pLcmlHdr->pBufHdr->hMarkTargetComponent = pComponentPrivate->hMarkTargetComponent;
   1762                 }
   1763                 pComponentPrivate->num_Reclaimed_Op_Buff++;
   1764                 G722DEC_DPRINT(": Component Sending Filled Output buffer%p to App\n", pLcmlHdr->pBufHdr);
   1765                 G722DEC_DPRINT("pLcmlHdr->pBufHdr = 0x%p\n", pLcmlHdr->pBufHdr);
   1766                 if (pComponentPrivate->curState != OMX_StatePause) {
   1767                     /* Copying time stamp information to output buffer */
   1768                     pLcmlHdr->pBufHdr->nTimeStamp = (OMX_TICKS)pComponentPrivate->arrTimestamp[pComponentPrivate->OpBufindex];
   1769                     /* Copying nTickCount information to output buffer */
   1770                     pLcmlHdr->pBufHdr->nTickCount = pComponentPrivate->arrTickCount[pComponentPrivate->OpBufindex];
   1771 
   1772                     pComponentPrivate->OpBufindex++;
   1773                     pComponentPrivate->OpBufindex %= pComponentPrivate->pPortDef[OMX_DirInput]->nBufferCountActual;
   1774 
   1775                     pComponentPrivate->cbInfo.FillBufferDone (pComponentPrivate->pHandle, /* pHandle, */
   1776                                                               pComponentPrivate->pHandle->pApplicationPrivate, /* pHandle->pApplicationPrivate, */
   1777                                                               pLcmlHdr->pBufHdr);
   1778                     pComponentPrivate->nOutStandingFillDones--;
   1779                     pComponentPrivate->lcml_nOpBuf--;
   1780                     pComponentPrivate->app_nBuf++;
   1781                     pComponentPrivate->nFillBufferDoneCount++;
   1782                 }
   1783                 /* <<<<<<<<<<<<<<<<<<<<< */
   1784             }
   1785         }
   1786     } else if(event == EMMCodecProcessingStoped) {
   1787         if (!pComponentPrivate->bNoIdleOnStop) {
   1788             pComponentPrivate->curState = OMX_StateIdle;
   1789 
   1790             pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   1791                                                    pComponentPrivate->pHandle->pApplicationPrivate,
   1792                                                    OMX_EventCmdComplete,
   1793                                                    OMX_CommandStateSet,
   1794                                                    pComponentPrivate->curState,
   1795                                                    NULL);
   1796             pComponentPrivate->bIdleCommandPending = OMX_FALSE;
   1797         } else {
   1798             pComponentPrivate->bNoIdleOnStop= OMX_FALSE;
   1799         }
   1800     } else if(event == EMMCodecAlgCtrlAck) {
   1801         G722DEC_DPRINT ("GOT MESSAGE USN_DSPACK_ALGCTRL \n");
   1802     } else if (event == EMMCodecDspError) {
   1803         G722DEC_DPRINT(":: commandedState  = %p\n",args[0]);
   1804         G722DEC_DPRINT(":: arg4 = %p\n",args[4]);
   1805         G722DEC_DPRINT(":: arg5 = %p\n",args[5]);
   1806         G722DEC_DPRINT(":: --------- EMMCodecDspError Here\n");
   1807         if(((int)args[4] == USN_ERR_WARNING) && ((int)args[5] == IUALG_WARN_PLAYCOMPLETED)) {
   1808             /* add callback to application to indicate SN/USN has completed playing of current set of date */
   1809             pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   1810                                                    pComponentPrivate->pHandle->pApplicationPrivate,
   1811                                                    OMX_EventBufferFlag,
   1812                                                    (OMX_U32)NULL,
   1813                                                    OMX_BUFFERFLAG_EOS,
   1814                                                    NULL);
   1815         }
   1816         if((int)args[5] == IUALG_WARN_CONCEALED) {
   1817             G722DEC_DPRINT( "Algorithm issued a warning. But can continue" );
   1818             G722DEC_DPRINT("%d :: arg5 = %p\n",__LINE__,args[5]);
   1819         }
   1820 
   1821         if((int)args[5] == IUALG_ERR_GENERAL) {
   1822             G722DEC_DPRINT( "Algorithm error. Cannot continue" );
   1823             G722DEC_DPRINT("%d :: arg5 = %p\n",__LINE__,args[5]);
   1824             G722DEC_DPRINT("%d :: LCML_Callback: IUALG_ERR_GENERAL\n",__LINE__);
   1825             pHandle = pComponentPrivate->pHandle;
   1826             pLcmlHandle = (LCML_DSP_INTERFACE *)pComponentPrivate->pLcmlHandle;
   1827         }
   1828 
   1829         if( (int)args[5] == IUALG_ERR_DATA_CORRUPT ){
   1830             char *pArgs = "damedesuStr";
   1831             G722DEC_DPRINT("%d :: arg5 = %p\n",__LINE__,args[5]);
   1832             G722DEC_DPRINT("%d :: LCML_Callback: IUALG_ERR_DATA_CORRUPT\n",__LINE__);
   1833             pHandle = pComponentPrivate->pHandle;
   1834             pLcmlHandle = (LCML_DSP_INTERFACE *)pComponentPrivate->pLcmlHandle;
   1835 
   1836             eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1837                                        MMCodecControlStop,(void *)pArgs);
   1838             if(eError != OMX_ErrorNone) {
   1839                 G722DEC_DPRINT("%d: Error Occurred in Codec Stop..\n",
   1840                                __LINE__);
   1841                 goto EXIT;
   1842             }
   1843             G722DEC_DPRINT("%d :: G722DEC: Codec has been Stopped here\n",__LINE__);
   1844             pComponentPrivate->curState = OMX_StateIdle;
   1845 
   1846             pComponentPrivate->cbInfo.EventHandler(
   1847                                                    pHandle, pHandle->pApplicationPrivate,
   1848                                                    OMX_EventCmdComplete, OMX_ErrorNone,0, NULL);
   1849 
   1850         }
   1851 
   1852         if( (int)args[5] == IUALG_WARN_OVERFLOW ){
   1853             G722DEC_DPRINT( "Algorithm error. Overflow" );
   1854         }
   1855         if( (int)args[5] == IUALG_WARN_UNDERFLOW ){
   1856             G722DEC_DPRINT( "Algorithm error. Underflow" );
   1857         }
   1858     } else if (event == EMMCodecStrmCtrlAck) {
   1859         G722DEC_DPRINT(":: GOT MESSAGE USN_DSPACK_STRMCTRL ----\n");
   1860     }
   1861 
   1862  EXIT:
   1863     G722DEC_DPRINT (":: Exiting the LCML_Callback() \n");
   1864     return eError;
   1865 }
   1866 
   1867 
   1868 /* ================================================================================= * */
   1869 /**
   1870  * @fn G722DEC_GetCorresponding_LCMLHeader() function gets the corresponding LCML
   1871  * header from the actual data buffer for required processing.
   1872  *
   1873  * @param *pBuffer This is the data buffer pointer.
   1874  *
   1875  * @param eDir   This is direction of buffer. Input/Output.
   1876  *
   1877  * @param *G722D_LCML_BUFHEADERTYPE  This is pointer to LCML Buffer Header.
   1878  *
   1879  * @pre          None
   1880  *
   1881  * @post         None
   1882  *
   1883  *  @return      OMX_ErrorNone = Successful Inirialization of the component\n
   1884  *               OMX_ErrorHardware = Hardware error has occured.
   1885  *
   1886  *  @see         None
   1887  */
   1888 /* ================================================================================ * */
   1889 OMX_ERRORTYPE G722DEC_GetCorresponding_LCMLHeader(G722DEC_COMPONENT_PRIVATE *pComponentPrivate,
   1890                                                   OMX_U8 *pBuffer,
   1891                                                   OMX_DIRTYPE eDir,
   1892                                                   G722D_LCML_BUFHEADERTYPE **ppLcmlHdr)
   1893 {
   1894     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1895     G722D_LCML_BUFHEADERTYPE *pLcmlBufHeader = NULL;
   1896     int nIpBuf=0, nOpBuf=0, i=0;
   1897 
   1898     G722DEC_DPRINT (":: Entering the G722DEC_GetCorresponding_LCMLHeader()\n");
   1899     G722DEC_DPRINT (":: eDir = %d\n",eDir);
   1900 
   1901     while (!pComponentPrivate->bInitParamsInitialized) {
   1902 #ifndef UNDER_CE
   1903         sched_yield();
   1904 #else
   1905         Sleep(0);
   1906 #endif
   1907     }
   1908 
   1909     if(eDir == OMX_DirInput) {
   1910         G722DEC_DPRINT (":: In GetCorresponding_LCMLHeader()\n");
   1911 
   1912         nIpBuf = pComponentPrivate->pInputBufferList->numBuffers;
   1913 
   1914         pLcmlBufHeader = pComponentPrivate->pLcmlBufHeader[G722D_INPUT_PORT];
   1915 
   1916         for(i=0; i<nIpBuf; i++) {
   1917             G722DEC_DPRINT("pBuffer = %p\n",pBuffer);
   1918             G722DEC_DPRINT("pLcmlBufHeader->pBufHdr->pBuffer = %p\n",pLcmlBufHeader->pBufHdr->pBuffer);
   1919             if(pBuffer == pLcmlBufHeader->pBufHdr->pBuffer) {
   1920                 *ppLcmlHdr = pLcmlBufHeader;
   1921                 G722DEC_DPRINT("::Corresponding LCML Header Found\n");
   1922                 goto EXIT;
   1923             }
   1924             pLcmlBufHeader++;
   1925         }
   1926     } else if (eDir == OMX_DirOutput) {
   1927         i = 0;
   1928         nOpBuf = pComponentPrivate->pOutputBufferList->numBuffers;
   1929 
   1930         pLcmlBufHeader = pComponentPrivate->pLcmlBufHeader[G722D_OUTPUT_PORT];
   1931         G722DEC_DPRINT (":: nOpBuf = %d\n",nOpBuf);
   1932 
   1933         for(i=0; i<nOpBuf; i++) {
   1934             G722DEC_DPRINT("pBuffer = %p\n",pBuffer);
   1935             G722DEC_DPRINT("pLcmlBufHeader->pBufHdr->pBuffer = %p\n",pLcmlBufHeader->pBufHdr->pBuffer);
   1936             if(pBuffer == pLcmlBufHeader->pBufHdr->pBuffer) {
   1937                 *ppLcmlHdr = pLcmlBufHeader;
   1938                 G722DEC_DPRINT("::Corresponding LCML Header Found\n");
   1939                 goto EXIT;
   1940             }
   1941             pLcmlBufHeader++;
   1942         }
   1943     } else {
   1944         G722DEC_DPRINT(":: Invalid Buffer Type :: exiting...\n");
   1945     }
   1946 
   1947  EXIT:
   1948     G722DEC_DPRINT (":: Exiting the GetCorresponding_LCMLHeader() \n");
   1949     return eError;
   1950 }
   1951 
   1952 /* ================================================================================= * */
   1953 /**
   1954  * @fn G722DEC_GetLCMLHandle() function gets the LCML handle and interacts with LCML
   1955  * by using this LCML Handle.
   1956  *
   1957  * @param *pBufHeader This is the buffer header that needs to be processed.
   1958  *
   1959  * @param *pComponentPrivate  This is component's private date structure.
   1960  *
   1961  * @pre          None
   1962  *
   1963  * @post         None
   1964  *
   1965  *  @return      OMX_HANDLETYPE = Successful loading of LCML library.
   1966  *               OMX_ErrorHardware = Hardware error has occured.
   1967  *
   1968  *  @see         None
   1969  */
   1970 /* ================================================================================ * */
   1971 #ifndef UNDER_CE
   1972 OMX_HANDLETYPE G722DEC_GetLCMLHandle(G722DEC_COMPONENT_PRIVATE *pComponentPrivate)
   1973 {
   1974     /* This must be taken care by WinCE */
   1975     OMX_HANDLETYPE pHandle = NULL;
   1976     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1977     void *handle = NULL;
   1978     OMX_ERRORTYPE (*fpGetHandle)(OMX_HANDLETYPE);
   1979     char *error = NULL;
   1980 
   1981     handle = dlopen("libLCML.so", RTLD_LAZY);
   1982     if (!handle) {
   1983         fputs(dlerror(), stderr);
   1984         goto EXIT;
   1985     }
   1986 
   1987     fpGetHandle = dlsym (handle, "GetHandle");
   1988     if ((error = dlerror()) != NULL) {
   1989         fputs(error, stderr);
   1990         goto EXIT;
   1991     }
   1992     eError = (*fpGetHandle)(&pHandle);
   1993     if(eError != OMX_ErrorNone) {
   1994         eError = OMX_ErrorUndefined;
   1995         G722DEC_DPRINT("eError != OMX_ErrorNone...\n");
   1996         pHandle = NULL;
   1997         goto EXIT;
   1998     }
   1999 
   2000     ((LCML_DSP_INTERFACE*)pHandle)->pComponentPrivate = pComponentPrivate;
   2001  EXIT:
   2002     return pHandle;
   2003 }
   2004 #else
   2005 /* WINDOWS Explicit dll load procedure */
   2006 OMX_HANDLETYPE G722DEC_GetLCMLHandle(G722DEC_COMPONENT_PRIVATE *pComponentPrivate)
   2007 {
   2008     typedef OMX_ERRORTYPE (*LPFNDLLFUNC1)(OMX_HANDLETYPE);
   2009     OMX_HANDLETYPE pHandle = NULL;
   2010     OMX_ERRORTYPE eError = OMX_ErrorNone;
   2011     HINSTANCE hDLL;               /* Handle to DLL */
   2012     LPFNDLLFUNC1 fpGetHandle1;
   2013 
   2014     hDLL = LoadLibraryEx(TEXT("OAF_BML.dll"), NULL,0);
   2015     if (hDLL == NULL)
   2016     {
   2017         /*fputs(dlerror(), stderr); */
   2018         G722DEC_DPRINT("BML Load Failed!!!\n");
   2019         return pHandle;
   2020     }
   2021 
   2022     fpGetHandle1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,TEXT("GetHandle"));
   2023     if (!fpGetHandle1)
   2024     {
   2025         /* handle the error */
   2026         FreeLibrary(hDLL);
   2027         return pHandle;
   2028     }
   2029 
   2030     /* call the function */
   2031     eError = fpGetHandle1(&pHandle);
   2032     if(eError != OMX_ErrorNone) {
   2033         eError = OMX_ErrorUndefined;
   2034         G722DEC_DPRINT("eError != OMX_ErrorNone...\n");
   2035         pHandle = NULL;
   2036         return pHandle;
   2037     }
   2038     ((LCML_DSP_INTERFACE*)pHandle)->pComponentPrivate = pComponentPrivate;
   2039     return pHandle;
   2040 }
   2041 #endif
   2042 
   2043 void G722DEC_CleanupInitParams(OMX_HANDLETYPE pComponent)
   2044 {
   2045     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent;
   2046     G722DEC_COMPONENT_PRIVATE *pComponentPrivate = (G722DEC_COMPONENT_PRIVATE *)
   2047         pHandle->pComponentPrivate;
   2048     G722D_LCML_BUFHEADERTYPE *pTemp_lcml = NULL;
   2049     OMX_U32 nIpBuf = pComponentPrivate->nRuntimeInputBuffers;
   2050     OMX_U32 nOpBuf = pComponentPrivate->nRuntimeOutputBuffers;
   2051     OMX_U32 i=0;
   2052     OMX_U8 *ptemp = NULL;
   2053 
   2054     G722DEC_DPRINT (":: G722DEC_CleanupInitParams()\n");
   2055     G722DEC_MEMPRINT(":: Freeing:  pComponentPrivate->strmAttr = %p\n", pComponentPrivate->strmAttr);
   2056 
   2057     G722D_OMX_FREE(pComponentPrivate->strmAttr);
   2058     /*pComponentPrivate->strmAttr = NULL;*/
   2059 
   2060     /*if (pComponentPrivate->dasfmode == 1) {*/
   2061     G722DEC_MEMPRINT(":: Freeing: pComponentPrivate->pParams = %p\n",pComponentPrivate->pParams);
   2062     ptemp = (OMX_U8*)pComponentPrivate->pParams;
   2063     if(ptemp != NULL){
   2064         ptemp -= 128;
   2065     }
   2066     pComponentPrivate->pParams = (G722D_USN_AudioCodecParams *)ptemp;
   2067     G722D_OMX_FREE(pComponentPrivate->pParams);
   2068     /*}*/
   2069 
   2070     pTemp_lcml = pComponentPrivate->pLcmlBufHeader[G722D_INPUT_PORT];
   2071     for(i=0; i<nIpBuf; i++) {
   2072         G722DEC_MEMPRINT(":: Freeing: pTemp_lcml->pIpParam = %p\n",pTemp_lcml->pIpParam);
   2073         G722D_OMX_FREE(pTemp_lcml->pIpParam);
   2074         pTemp_lcml++;
   2075     }
   2076 
   2077     G722DEC_MEMPRINT(":: Freeing pComponentPrivate->pLcmlBufHeader[G722D_INPUT_PORT] = %p\n",
   2078                      pComponentPrivate->pLcmlBufHeader[G722D_INPUT_PORT]);
   2079     G722D_OMX_FREE(pComponentPrivate->pLcmlBufHeader[G722D_INPUT_PORT]);
   2080 
   2081 
   2082     pTemp_lcml = pComponentPrivate->pLcmlBufHeader[G722D_OUTPUT_PORT];
   2083     for(i=0; i<nOpBuf; i++) {
   2084         G722DEC_MEMPRINT(":: Freeing: pTemp_lcml->pIpParam = %p\n",pTemp_lcml->pOpParam);
   2085         G722D_OMX_FREE(pTemp_lcml->pOpParam);
   2086         pTemp_lcml++;
   2087     }
   2088 
   2089     G722DEC_MEMPRINT(":: Freeing: pComponentPrivate->pLcmlBufHeader[G722D_OUTPUT_PORT] = %p\n",
   2090                      pComponentPrivate->pLcmlBufHeader[G722D_OUTPUT_PORT]);
   2091     G722D_OMX_FREE(pComponentPrivate->pLcmlBufHeader[G722D_OUTPUT_PORT]);
   2092     G722DEC_DPRINT ("Exiting Successfully G722DEC_CleanupInitParams()\n");
   2093 }
   2094 /* ========================================================================== */
   2095 /**
   2096  * @G722DEC_SetPending() This function marks the buffer as pending when it is sent
   2097  * to DSP/
   2098  *
   2099  * @param pComponentPrivate This is component's private date area.
   2100  *
   2101  * @param pBufHdr This is poiter to OMX Buffer header whose buffer is sent to DSP
   2102  *
   2103  * @param eDir This is direction of buffer i.e. input or output.
   2104  *
   2105  * @pre None
   2106  *
   2107  * @post None
   2108  *
   2109  * @return none
   2110  */
   2111 /* ========================================================================== */
   2112 void G722DEC_SetPending(G722DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir, OMX_U32 lineNumber)
   2113 {
   2114     OMX_U16 i = 0;
   2115 
   2116     G722DEC_DPRINT("Called G722DEC_SetPending\n");
   2117     G722DEC_DPRINT("eDir = %d\n",eDir);
   2118 
   2119     if (eDir == OMX_DirInput) {
   2120         for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) {
   2121             if (pBufHdr == pComponentPrivate->pInputBufferList->pBufHdr[i]) {
   2122                 pComponentPrivate->pInputBufferList->bBufferPending[i] = 1;
   2123                 G722DEC_DPRINT("*******************INPUT BUFFER %d IS PENDING Line %ld******************************\n",i,lineNumber);
   2124             }
   2125         }
   2126     }
   2127     else {
   2128         for (i=0; i < pComponentPrivate->pOutputBufferList->numBuffers; i++) {
   2129             if (pBufHdr == pComponentPrivate->pOutputBufferList->pBufHdr[i]) {
   2130                 pComponentPrivate->pOutputBufferList->bBufferPending[i] = 1;
   2131                 G722DEC_DPRINT("*******************OUTPUT BUFFER %d IS PENDING Line %ld******************************\n",i,lineNumber);
   2132             }
   2133         }
   2134     }
   2135 }
   2136 
   2137 /* ========================================================================== */
   2138 /**
   2139  * @G722DEC_ClearPending() This function clears the buffer status from pending
   2140  * when it is received back from DSP.
   2141  *
   2142  * @param pComponentPrivate This is component's private date area.
   2143  *
   2144  * @param pBufHdr This is poiter to OMX Buffer header that is received from
   2145  * DSP/LCML.
   2146  *
   2147  * @param eDir This is direction of buffer i.e. input or output.
   2148  *
   2149  * @pre None
   2150  *
   2151  * @post None
   2152  *
   2153  * @return none
   2154  */
   2155 /* ========================================================================== */
   2156 
   2157 void G722DEC_ClearPending(G722DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir, OMX_U32 lineNumber)
   2158 {
   2159     OMX_U16 i = 0;
   2160 
   2161     if (eDir == OMX_DirInput) {
   2162         for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) {
   2163             if (pBufHdr == pComponentPrivate->pInputBufferList->pBufHdr[i]) {
   2164                 pComponentPrivate->pInputBufferList->bBufferPending[i] = 0;
   2165                 G722DEC_DPRINT("*******************INPUT BUFFER %d IS RECLAIMED Line %ld******************************\n",i,lineNumber);
   2166             }
   2167         }
   2168     }
   2169     else {
   2170         for (i=0; i < pComponentPrivate->pOutputBufferList->numBuffers; i++) {
   2171             if (pBufHdr == pComponentPrivate->pOutputBufferList->pBufHdr[i]) {
   2172                 pComponentPrivate->pOutputBufferList->bBufferPending[i] = 0;
   2173                 G722DEC_DPRINT("*******************OUTPUT BUFFER %d IS RECLAIMED Line %ld******************************\n",i,lineNumber);
   2174             }
   2175         }
   2176     }
   2177 }
   2178 
   2179 /* ========================================================================== */
   2180 /**
   2181  * @G722DEC_IsPending() This function checks whether or not a buffer is pending.
   2182  *
   2183  * @param pComponentPrivate This is component's private date area.
   2184  *
   2185  * @param pBufHdr This is poiter to OMX Buffer header of interest.
   2186  *
   2187  * @param eDir This is direction of buffer i.e. input or output.
   2188  *
   2189  * @pre None
   2190  *
   2191  * @post None
   2192  *
   2193  * @return none
   2194  */
   2195 /* ========================================================================== */
   2196 
   2197 OMX_U32 G722DEC_IsPending(G722DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir)
   2198 {
   2199     OMX_U16 i = 0;
   2200 
   2201     if (eDir == OMX_DirInput) {
   2202         for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) {
   2203             if (pBufHdr == pComponentPrivate->pInputBufferList->pBufHdr[i]) {
   2204                 return pComponentPrivate->pInputBufferList->bBufferPending[i];
   2205             }
   2206         }
   2207     }
   2208     else {
   2209         for (i=0; i < pComponentPrivate->pOutputBufferList->numBuffers; i++) {
   2210             if (pBufHdr == pComponentPrivate->pOutputBufferList->pBufHdr[i]) {
   2211                 return pComponentPrivate->pOutputBufferList->bBufferPending[i];
   2212             }
   2213         }
   2214     }
   2215     return -1;
   2216 }
   2217 
   2218 
   2219 /* ========================================================================== */
   2220 /**
   2221  * @G722DEC_IsValid() This function identifies whether or not buffer recieved from
   2222  * LCML is valid. It searches in the list of input/output buffers to do this.
   2223  *
   2224  * @param pComponentPrivate This is component's private date area.
   2225  *
   2226  * @param pBufHdr This is poiter to OMX Buffer header of interest.
   2227  *
   2228  * @param eDir This is direction of buffer i.e. input or output.
   2229  *
   2230  * @pre None
   2231  *
   2232  * @post None
   2233  *
   2234  * @return status of the buffer.
   2235  */
   2236 /* ========================================================================== */
   2237 
   2238 OMX_U32 G722DEC_IsValid(G722DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U8 *pBuffer, OMX_DIRTYPE eDir)
   2239 {
   2240     OMX_U16 i = 0;
   2241     OMX_U32 found=0;
   2242 
   2243     if (eDir == OMX_DirInput) {
   2244         for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) {
   2245             if (pBuffer == pComponentPrivate->pInputBufferList->pBufHdr[i]->pBuffer) {
   2246                 found = 1;
   2247             }
   2248         }
   2249     }
   2250     else {
   2251         for (i=0; i < pComponentPrivate->pOutputBufferList->numBuffers; i++) {
   2252             if (pBuffer == pComponentPrivate->pOutputBufferList->pBufHdr[i]->pBuffer) {
   2253                 found = 1;
   2254             }
   2255         }
   2256     }
   2257     return found;
   2258 }
   2259 
   2260 /* ========================================================================== */
   2261 /**
   2262  * @G722DECFill_LCMLInitParamsEx() This function initializes the init parameter of
   2263  * the LCML structure when a port is enabled and component is in idle state.
   2264  *
   2265  * @param pComponent This is component handle.
   2266  *
   2267  * @pre None
   2268  *
   2269  * @post None
   2270  *
   2271  * @return appropriate OMX Error.
   2272  */
   2273 /* ========================================================================== */
   2274 
   2275 OMX_ERRORTYPE G722DECFill_LCMLInitParamsEx(OMX_HANDLETYPE pComponent)
   2276 
   2277 {
   2278     OMX_ERRORTYPE eError = OMX_ErrorNone;
   2279     OMX_U32 nIpBuf = 0,nIpBufSize = 0,nOpBuf = 0,nOpBufSize = 0;
   2280     OMX_U32 i = 0;
   2281     OMX_BUFFERHEADERTYPE *pTemp = NULL;
   2282     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent;
   2283     G722DEC_COMPONENT_PRIVATE *pComponentPrivate =
   2284         (G722DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
   2285     G722D_LCML_BUFHEADERTYPE *pTemp_lcml = NULL;
   2286     OMX_U32 size_lcml = 0;
   2287     OMX_U8 *ptr = NULL;
   2288 
   2289 
   2290     G722DEC_DPRINT(":: Entered Fill_LCMLInitParams");
   2291 
   2292 
   2293     nIpBuf = pComponentPrivate->pInputBufferList->numBuffers;
   2294     nOpBuf = pComponentPrivate->pOutputBufferList->numBuffers;
   2295     nIpBufSize = pComponentPrivate->pPortDef[G722D_INPUT_PORT]->nBufferSize;
   2296     nOpBufSize = pComponentPrivate->pPortDef[G722D_OUTPUT_PORT]->nBufferSize;
   2297 
   2298     G722DEC_BUFPRINT("Input Buffer Count = %ld\n",nIpBuf);
   2299     G722DEC_BUFPRINT("Input Buffer Size = %ld\n",nIpBufSize);
   2300     G722DEC_BUFPRINT("Output Buffer Count = %ld\n",nOpBuf);
   2301     G722DEC_BUFPRINT("Output Buffer Size = %ld\n",nOpBufSize);
   2302 
   2303     G722DEC_DPRINT(":: bufAlloced = %d\n",pComponentPrivate->bufAlloced);
   2304     size_lcml = nIpBuf * sizeof(G722D_LCML_BUFHEADERTYPE);
   2305 
   2306     G722D_OMX_MALLOC_SIZE(ptr,size_lcml,OMX_U8);
   2307     pTemp_lcml = (G722D_LCML_BUFHEADERTYPE *)ptr;
   2308 
   2309     pComponentPrivate->pLcmlBufHeader[G722D_INPUT_PORT] = pTemp_lcml;
   2310 
   2311     for (i=0; i<nIpBuf; i++) {
   2312         if(pComponentPrivate->bufAlloced == 0) {
   2313             G722D_OMX_MALLOC(pTemp, OMX_BUFFERHEADERTYPE);
   2314         } else {
   2315             G722DEC_DPRINT(":: IpBufferHeader %p is already there\n",
   2316                            pComponentPrivate->pInputBufferList->pBufHdr[i]);
   2317             pTemp = pComponentPrivate->pInputBufferList->pBufHdr[i];
   2318         }
   2319 
   2320         pTemp->nSize = sizeof(OMX_BUFFERHEADERTYPE);
   2321 
   2322         pTemp->nAllocLen = nIpBufSize;
   2323         pTemp->nFilledLen = nIpBufSize;
   2324         pTemp->nVersion.s.nVersionMajor = G722DEC_MAJOR_VER;
   2325         pTemp->nVersion.s.nVersionMinor = G722DEC_MINOR_VER;
   2326 
   2327         pTemp->pPlatformPrivate = pHandle->pComponentPrivate;
   2328         pTemp->nTickCount = DONT_CARE;
   2329 
   2330         if (pComponentPrivate->bufAlloced == 0) {
   2331             G722D_OMX_MALLOC_SIZE(pTemp->pBuffer,(nIpBufSize+256),OMX_U8);
   2332             pTemp->pBuffer = pTemp->pBuffer + 128;
   2333         } else {
   2334             G722DEC_DPRINT(":: IpBuffer %p is already there\n",pTemp->pBuffer);
   2335         }
   2336 
   2337         if (pTemp->pBuffer == NULL) {
   2338             G722DEC_DPRINT(":: Malloc Failed...\n");
   2339             goto EXIT;
   2340         }
   2341 
   2342         pTemp_lcml->pBufHdr = pTemp;
   2343         pTemp_lcml->eDir = OMX_DirInput;
   2344         pTemp_lcml->pOtherParams[i] = NULL;
   2345 
   2346         G722D_OMX_MALLOC(pTemp_lcml->pIpParam, G722DEC_ParamStruct);
   2347         pTemp_lcml->pIpParam->usLastFrame = 0;
   2348 
   2349         pTemp->nFlags = NORMAL_BUFFER;
   2350         ((G722DEC_COMPONENT_PRIVATE *) pTemp->pPlatformPrivate)->pHandle = pHandle;
   2351 
   2352         G722DEC_DPRINT("::Comp: InBuffHeader[%ld] = %p\n", i, pTemp);
   2353         G722DEC_DPRINT("::Comp:  >>>> InputBuffHeader[%ld]->pBuffer = %p\n", i, pTemp->pBuffer);
   2354         G722DEC_DPRINT("::Comp: Ip : pTemp_lcml[%ld] = %p\n", i, pTemp_lcml);
   2355 
   2356         pTemp_lcml++;
   2357     }
   2358 
   2359     size_lcml = nOpBuf * sizeof(G722D_LCML_BUFHEADERTYPE);
   2360 
   2361     G722D_OMX_MALLOC_SIZE(pTemp_lcml,size_lcml,G722D_LCML_BUFHEADERTYPE);
   2362     pComponentPrivate->pLcmlBufHeader[G722D_OUTPUT_PORT] = pTemp_lcml;
   2363 
   2364     for (i=0; i<nOpBuf; i++) {
   2365         if(pComponentPrivate->bufAlloced == 0) {
   2366             G722D_OMX_MALLOC(pTemp, OMX_BUFFERHEADERTYPE);
   2367         } else {
   2368             G722DEC_DPRINT(":: OpBufferHeader %p is already there\n",
   2369                            pComponentPrivate->pOutputBufferList->pBufHdr[i]);
   2370             pTemp = pComponentPrivate->pOutputBufferList->pBufHdr[i];
   2371         }
   2372 
   2373         pTemp->nSize = sizeof(OMX_BUFFERHEADERTYPE);
   2374 
   2375         pTemp->nAllocLen = nOpBufSize;
   2376         pTemp->nFilledLen = nOpBufSize;
   2377         pTemp->nVersion.s.nVersionMajor = G722DEC_MAJOR_VER;
   2378         pTemp->nVersion.s.nVersionMinor = G722DEC_MINOR_VER;
   2379 
   2380         pTemp->pPlatformPrivate = pHandle->pComponentPrivate;
   2381         pTemp->nTickCount = 0;
   2382         pTemp->nTimeStamp = 0;
   2383 
   2384         if (pComponentPrivate->bufAlloced == 0) {
   2385             G722D_OMX_MALLOC_SIZE(pTemp->pBuffer,(nOpBufSize+256),OMX_U8);
   2386 
   2387             pTemp->pBuffer += 128;
   2388             G722DEC_DPRINT("%d:: OpBuffer %p is already there\n",__LINE__,pTemp->pBuffer);
   2389         } else {
   2390             G722DEC_DPRINT(":: OpBuffer %p is already there\n",pTemp->pBuffer);
   2391         }
   2392 
   2393         pTemp_lcml->pBufHdr = pTemp;
   2394         pTemp_lcml->eDir = OMX_DirOutput;
   2395         pTemp_lcml->pOtherParams[i] = NULL;
   2396 
   2397         pTemp->nFlags = NORMAL_BUFFER;
   2398         ((G722DEC_COMPONENT_PRIVATE *)pTemp->pPlatformPrivate)->pHandle = pHandle;
   2399         G722DEC_DPRINT("::Comp:  >>>>>>>>>>>>> OutBuffHeader[%ld] = %p\n", i, pTemp);
   2400         G722DEC_DPRINT("::Comp:  >>>> OutBuffHeader[%ld]->pBuffer = %p\n", i, pTemp->pBuffer);
   2401         G722DEC_DPRINT("::Comp: Op : pTemp_lcml[%ld] = %p\n", i, pTemp_lcml);
   2402         pTemp_lcml++;
   2403     }
   2404     pComponentPrivate->bPortDefsAllocated = 1;
   2405 
   2406     G722DEC_DPRINT(":: Exiting Fill_LCMLInitParams");
   2407 
   2408     pComponentPrivate->bInitParamsInitialized = 1;
   2409 
   2410  EXIT:
   2411     return eError;
   2412 }
   2413 /**
   2414  *
   2415  */
   2416 void printEmmEvent (TUsnCodecEvent event)
   2417 {
   2418     switch(event) {
   2419 
   2420     case EMMCodecDspError:
   2421         G722DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecDspError >>>>>>>>>>\n");
   2422         break;
   2423 
   2424     case EMMCodecInternalError:
   2425         G722DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecInternalError >>>>>>>>>> \n");
   2426         break;
   2427 
   2428     case EMMCodecInitError:
   2429         G722DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecInitError>>>>>>>>>> \n");
   2430         break;
   2431 
   2432     case EMMCodecDspMessageRecieved:
   2433         G722DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecDspMessageRecieved>>>>>>>>>> \n");
   2434         break;
   2435 
   2436     case EMMCodecBufferProcessed:
   2437         G722DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecBufferProcessed>>>>>>>>>> \n");
   2438         break;
   2439 
   2440     case EMMCodecProcessingStarted:
   2441         G722DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecProcessingStarted>>>>>>>>>> \n");
   2442         break;
   2443 
   2444     case EMMCodecProcessingPaused:
   2445         G722DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecProcessingPaused>>>>>>>>>> \n");
   2446         break;
   2447 
   2448     case EMMCodecProcessingStoped:
   2449         G722DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecProcessingStoped>>>>>>>>>> \n");
   2450         break;
   2451 
   2452     case EMMCodecProcessingEof:
   2453         G722DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecProcessingEof>>>>>>>>>> \n");
   2454         break;
   2455 
   2456     case EMMCodecBufferNotProcessed:
   2457         G722DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecBufferNotProcessed>>>>>>>>>> \n");
   2458         break;
   2459 
   2460     case EMMCodecAlgCtrlAck:
   2461         G722DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecAlgCtrlAck>>>>>>>>>> \n");
   2462         break;
   2463 
   2464     case EMMCodecStrmCtrlAck:
   2465         G722DEC_DPRINT("[LCML CALLBACK EVENT]  EMMCodecStrmCtrlAck>>>>>>>>>> \n");
   2466         break;
   2467     }
   2468     return;
   2469 }
   2470