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_G711Decoder.c
     30  *
     31  * This file implements OMX Component for G711 decoder that
     32  * is fully compliant with the OMX Audio specification.
     33  *
     34  * @path  $(CSLPATH)\
     35  *
     36  * @rev  0.1
     37  */
     38 /* ----------------------------------------------------------------------------*/
     39 
     40 /* ------compilation control switches -------------------------*/
     41 /****************************************************************
     42  *  INCLUDE FILES
     43  ****************************************************************/
     44 /* ----- system and platform files ----------------------------*/
     45 #ifdef UNDER_CE
     46 #include <windows.h>
     47 #include <oaf_osal.h>
     48 #include <omx_core.h>
     49 #else
     50 #include <unistd.h>
     51 #include <sys/time.h>
     52 #include <sys/types.h>
     53 #include <sys/ioctl.h>
     54 #include <sys/select.h>
     55 #include <errno.h>
     56 #include <pthread.h>
     57 #endif
     58 #include <string.h>
     59 #include <fcntl.h>
     60 #include <stdlib.h>
     61 #include <stdio.h>
     62 #include <dbapi.h>
     63 
     64 #ifdef DSP_RENDERING_ON
     65 #include <AudioManagerAPI.h>
     66 #endif
     67 
     68 #ifdef RESOURCE_MANAGER_ENABLED
     69 #include <ResourceManagerProxyAPI.h>
     70 #endif
     71 
     72 /*-------program files ----------------------------------------*/
     73 #include <OMX_Component.h>
     74 #include <TIDspOmx.h>
     75 #include "OMX_G711Dec_Utils.h"
     76 
     77 #ifdef G711DEC_MEMDEBUG
     78 extern void *arr[500] = {NULL};
     79 extern int lines[500] = {0};
     80 extern int bytes[500] = {0};
     81 extern char file[500][50] = {""};
     82 /*extern int ind=0;*/
     83 #define newmalloc(x) mymalloc(__LINE__,__FILE__,x)
     84 void * mymalloc(int line, char *s, int size);
     85 #define newfree(z) myfree(z,__LINE__,__FILE__)
     86 void myfree(void *dp, int line, char *s);
     87 #else
     88 #define newmalloc(x) malloc(x)
     89 #define newfree(z) free(z)
     90 #endif
     91 
     92 /****************************************************************
     93  *  EXTERNAL REFERENCES NOTE : only use if not found in header file
     94  ****************************************************************/
     95 /*--------data declarations -----------------------------------*/
     96 
     97 /*--------function prototypes ---------------------------------*/
     98 
     99 /****************************************************************
    100  *  PUBLIC DECLARATIONS Defined here, used elsewhere
    101  ****************************************************************/
    102 /*--------data declarations -----------------------------------*/
    103 
    104 /*--------function prototypes ---------------------------------*/
    105 
    106 /****************************************************************
    107  *  PRIVATE DECLARATIONS Defined here, used only here
    108  ****************************************************************/
    109 /*--------data declarations -----------------------------------*/
    110 
    111 /*--------function prototypes ---------------------------------*/
    112 
    113 static OMX_ERRORTYPE SetCallbacks (OMX_HANDLETYPE hComp,
    114                                    OMX_CALLBACKTYPE* pCallBacks, OMX_PTR pAppData);
    115 static OMX_ERRORTYPE GetComponentVersion (OMX_HANDLETYPE hComp,
    116                                           OMX_STRING pComponentName,
    117                                           OMX_VERSIONTYPE* pComponentVersion,
    118                                           OMX_VERSIONTYPE* pSpecVersion,
    119                                           OMX_UUIDTYPE* pComponentUUID);
    120 
    121 static OMX_ERRORTYPE SendCommand (OMX_HANDLETYPE hComp, OMX_COMMANDTYPE nCommand,
    122                                   OMX_U32 nParam, OMX_PTR pCmdData);
    123 
    124 static OMX_ERRORTYPE GetParameter(OMX_HANDLETYPE hComp, OMX_INDEXTYPE nParamIndex,
    125                                   OMX_PTR ComponentParamStruct);
    126 static OMX_ERRORTYPE SetParameter (OMX_HANDLETYPE hComp,
    127                                    OMX_INDEXTYPE nParamIndex,
    128                                    OMX_PTR ComponentParamStruct);
    129 static OMX_ERRORTYPE GetConfig (OMX_HANDLETYPE hComp,
    130                                 OMX_INDEXTYPE nConfigIndex,
    131                                 OMX_PTR pComponentConfigStructure);
    132 static OMX_ERRORTYPE SetConfig (OMX_HANDLETYPE hComp,
    133                                 OMX_INDEXTYPE nConfigIndex,
    134                                 OMX_PTR pComponentConfigStructure);
    135 
    136 static OMX_ERRORTYPE EmptyThisBuffer (OMX_HANDLETYPE hComp, OMX_BUFFERHEADERTYPE* pBuffer);
    137 
    138 static OMX_ERRORTYPE FillThisBuffer (OMX_HANDLETYPE hComp, OMX_BUFFERHEADERTYPE* pBuffer);
    139 static OMX_ERRORTYPE GetState (OMX_HANDLETYPE hComp, OMX_STATETYPE* pState);
    140 static OMX_ERRORTYPE ComponentTunnelRequest (OMX_HANDLETYPE hComp,
    141                                              OMX_U32 nPort, OMX_HANDLETYPE hTunneledComp,
    142                                              OMX_U32 nTunneledPort,
    143                                              OMX_TUNNELSETUPTYPE* pTunnelSetup);
    144 
    145 static OMX_ERRORTYPE ComponentDeInit(OMX_HANDLETYPE pHandle);
    146 static OMX_ERRORTYPE AllocateBuffer (OMX_IN OMX_HANDLETYPE hComponent,
    147                                      OMX_INOUT OMX_BUFFERHEADERTYPE** pBuffer,
    148                                      OMX_IN OMX_U32 nPortIndex,
    149                                      OMX_IN OMX_PTR pAppPrivate,
    150                                      OMX_IN OMX_U32 nSizeBytes);
    151 
    152 static OMX_ERRORTYPE FreeBuffer(OMX_IN  OMX_HANDLETYPE hComponent,
    153                                 OMX_IN  OMX_U32 nPortIndex,
    154                                 OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
    155 
    156 static OMX_ERRORTYPE UseBuffer (OMX_IN OMX_HANDLETYPE hComponent,
    157                                 OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
    158                                 OMX_IN OMX_U32 nPortIndex,
    159                                 OMX_IN OMX_PTR pAppPrivate,
    160                                 OMX_IN OMX_U32 nSizeBytes,
    161                                 OMX_IN OMX_U8* pBuffer);
    162 
    163 static OMX_ERRORTYPE GetExtensionIndex(OMX_IN  OMX_HANDLETYPE hComponent,
    164                                        OMX_IN  OMX_STRING cParameterName,
    165                                        OMX_OUT OMX_INDEXTYPE *pIndexType);
    166 
    167 static OMX_ERRORTYPE ComponentRoleEnum(OMX_IN OMX_HANDLETYPE hComponent,
    168                                        OMX_OUT OMX_U8 *cRole,
    169                                        OMX_IN OMX_U32 nIndex);
    170 
    171 /* ======================================================================= */
    172 /**
    173  * @def    FIFO1, FIFO2              Define Fifo Path
    174  */
    175 /* ======================================================================= */
    176 #define FIFO1 "/dev/fifo.1"
    177 #define FIFO2 "/dev/fifo.2"
    178 
    179 /* ======================================================================= */
    180 /**
    181  * @def    PERMS                      Define Read and Write Permisions.
    182  */
    183 /* ======================================================================= */
    184 #define PERMS 0666
    185 #define G711_DEC_ROLE "audio_decoder.g711"
    186 #ifdef DSP_RENDERING_ON
    187 AM_COMMANDDATATYPE cmd_data;
    188 #endif
    189 /*-------------------------------------------------------------------*/
    190 /**
    191  * OMX_ComponentInit() Set the all the function pointers of component
    192  *
    193  * This method will update the component function pointer to the handle
    194  *
    195  * @param hComp         handle for this instance of the component
    196  *
    197  * @retval OMX_NoError              Success, ready to roll
    198  *         OMX_ErrorInsufficientResources If the malloc fails
    199  **/
    200 /*-------------------------------------------------------------------*/
    201 OMX_ERRORTYPE OMX_ComponentInit (OMX_HANDLETYPE hComp)
    202 {
    203 
    204     OMX_PARAM_PORTDEFINITIONTYPE *pPortDef_ip = NULL, *pPortDef_op = NULL;
    205     G711DEC_COMPONENT_PRIVATE *pComponentPrivate = NULL;
    206     OMX_AUDIO_PARAM_PCMMODETYPE *g711_ip = NULL, *g711_op = NULL;
    207     G711DEC_PORT_TYPE *pCompPort = NULL;
    208     OMX_AUDIO_PARAM_PORTFORMATTYPE *pInPortFormatArr = NULL;
    209     OMX_AUDIO_PARAM_PORTFORMATTYPE *pOutPortFormatArr = NULL;
    210     OMX_ERRORTYPE eError = OMX_ErrorNone;
    211     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE*) hComp;
    212     OMX_S16 i = 0;
    213 
    214     G711DEC_DPRINT ("%d ::OMX_ComponentInit\n", __LINE__);
    215 
    216     /*Set the all component function pointer to the handle */
    217     pHandle->SetCallbacks = SetCallbacks;
    218     pHandle->GetComponentVersion = GetComponentVersion;
    219     pHandle->SendCommand = SendCommand;
    220     pHandle->GetParameter = GetParameter;
    221     pHandle->SetParameter = SetParameter;
    222     pHandle->GetConfig = GetConfig;
    223     pHandle->SetConfig = SetConfig;
    224     pHandle->GetState = GetState;
    225     pHandle->EmptyThisBuffer = EmptyThisBuffer;
    226     pHandle->FillThisBuffer = FillThisBuffer;
    227     pHandle->ComponentTunnelRequest = ComponentTunnelRequest;
    228     pHandle->ComponentDeInit = ComponentDeInit;
    229     pHandle->AllocateBuffer = AllocateBuffer;
    230     pHandle->FreeBuffer = FreeBuffer;
    231     pHandle->UseBuffer = UseBuffer;
    232     pHandle->GetExtensionIndex = GetExtensionIndex;
    233     pHandle->ComponentRoleEnum = ComponentRoleEnum;
    234 
    235     /*Allocate the memory for Component private data area */
    236     G711D_OMX_MALLOC(pHandle->pComponentPrivate, G711DEC_COMPONENT_PRIVATE);
    237 
    238     ((G711DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate)->pHandle = pHandle;
    239 
    240     /* Initialize component data structures to default values */
    241     ((G711DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate)->sPortParam.nPorts = 0x2;
    242     ((G711DEC_COMPONENT_PRIVATE *)
    243      pHandle->pComponentPrivate)->sPortParam.nStartPortNumber = 0x0;
    244 
    245     eError = OMX_ErrorNone;
    246 
    247     G711D_OMX_MALLOC(g711_ip, OMX_AUDIO_PARAM_PCMMODETYPE);
    248     G711D_OMX_MALLOC(g711_op, OMX_AUDIO_PARAM_PCMMODETYPE);
    249 
    250     G711DEC_DPRINT ("%d ::LINE \n", __LINE__);
    251 
    252     ((G711DEC_COMPONENT_PRIVATE *)
    253      pHandle->pComponentPrivate)->g711Params[G711DEC_INPUT_PORT] = g711_ip;
    254     ((G711DEC_COMPONENT_PRIVATE *)
    255      pHandle->pComponentPrivate)->g711Params[G711DEC_OUTPUT_PORT] = g711_op;
    256 
    257     g711_ip->nPortIndex = G711DEC_INPUT_PORT;
    258     g711_op->nPortIndex = G711DEC_OUTPUT_PORT;
    259 
    260     G711DEC_DPRINT("%d Malloced g711Params[G711DEC_INPUT_PORT] = 0x%x\n",__LINE__,
    261                    (unsigned int)((G711DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate)->g711Params[G711DEC_INPUT_PORT]);
    262     G711DEC_DPRINT("%d Malloced g711Params[G711DEC_OUTPUT_PORT] = 0x%x\n",__LINE__,
    263                    (unsigned int)((G711DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate)->g711Params[G711DEC_OUTPUT_PORT]);
    264 
    265 
    266     pComponentPrivate = pHandle->pComponentPrivate;
    267     G711D_OMX_MALLOC(pComponentPrivate->pInputBufferList, G711DEC_BUFFERLIST);
    268     pComponentPrivate->pInputBufferList->numBuffers = 0; /* initialize number of buffers */
    269     G711D_OMX_MALLOC(pComponentPrivate->pOutputBufferList, G711DEC_BUFFERLIST);
    270 
    271     G711D_OMX_MALLOC(pCompPort, G711DEC_PORT_TYPE);
    272     pComponentPrivate->pCompPort[G711DEC_INPUT_PORT] = pCompPort;
    273     G711D_OMX_MALLOC(pCompPort, G711DEC_PORT_TYPE);
    274     pComponentPrivate->pCompPort[G711DEC_OUTPUT_PORT] = pCompPort;
    275 
    276     pComponentPrivate->pOutputBufferList->numBuffers = 0; /* initialize number of buffers */
    277     pComponentPrivate->bPlayCompleteFlag = 0;
    278 
    279     for (i=0; i < MAX_NUM_OF_BUFS; i++) {
    280         pComponentPrivate->pOutputBufferList->pBufHdr[i] = NULL;
    281         pComponentPrivate->pInputBufferList->pBufHdr[i] = NULL;
    282     }
    283 
    284     G711DEC_DPRINT("Setting dasfmode and mimemode to 0\n");
    285     pComponentPrivate->dasfmode = 0;
    286     pComponentPrivate->bPortDefsAllocated = 1;
    287     pComponentPrivate->bCompThreadStarted = 0;
    288     pComponentPrivate->nHoldLength = 0;
    289     pComponentPrivate->pHoldBuffer = NULL;
    290     pComponentPrivate->bInitParamsInitialized = 0;
    291     pComponentPrivate->pMarkBuf = NULL;
    292     pComponentPrivate->pMarkData = NULL;
    293     pComponentPrivate->nEmptyBufferDoneCount = 0;
    294     pComponentPrivate->nEmptyThisBufferCount = 0;
    295     pComponentPrivate->nFillBufferDoneCount = 0;
    296     pComponentPrivate->nFillThisBufferCount = 0;
    297     pComponentPrivate->strmAttr = NULL;
    298     pComponentPrivate->nDataWritesWhilePaused = 0;
    299     pComponentPrivate->bIdleCommandPending = 0;
    300     pComponentPrivate->bDisableCommandParam = 0;
    301     pComponentPrivate->bEnableCommandParam = 0;
    302     pComponentPrivate->nRuntimeInputBuffers = 0;
    303 
    304     for (i=0; i < MAX_NUM_OF_BUFS; i++) {
    305         pComponentPrivate->pInputBufHdrPending[i] = NULL;
    306         pComponentPrivate->pOutputBufHdrPending[i] = NULL;
    307     }
    308 
    309     pComponentPrivate->bJustReenabled = 0;
    310     pComponentPrivate->nInvalidFrameCount = 0;
    311     pComponentPrivate->nNumInputBufPending = 0;
    312     pComponentPrivate->nNumOutputBufPending = 0;
    313     pComponentPrivate->bDisableCommandPending = 0;
    314     pComponentPrivate->bEnableCommandPending = 0;
    315     pComponentPrivate->nOutStandingFillDones = 0;
    316     pComponentPrivate->bStopSent = 0;
    317     pComponentPrivate->bBypassDSP = OMX_FALSE;
    318     pComponentPrivate->bNoIdleOnStop = OMX_FALSE;
    319     pComponentPrivate->bPreempted = OMX_FALSE;
    320 
    321     G711D_OMX_MALLOC_SIZE(pComponentPrivate->sDeviceString, 100*sizeof(OMX_STRING), OMX_STRING);
    322     /* initialize role name */
    323     strcpy((char*)pComponentPrivate->componentRole.cRole,G711_DEC_ROLE);
    324     /* Initialize device string to the default value */
    325     strcpy((char*)pComponentPrivate->sDeviceString,"/eteedn:i0:o0/codec\0");
    326 
    327     /* Removing sleep() calls. Initialization.*/
    328 #ifndef UNDER_CE
    329     pthread_mutex_init(&pComponentPrivate->AlloBuf_mutex, NULL);
    330     pthread_cond_init (&pComponentPrivate->AlloBuf_threshold, NULL);
    331     pComponentPrivate->AlloBuf_waitingsignal = 0;
    332 
    333     pthread_mutex_init(&pComponentPrivate->InLoaded_mutex, NULL);
    334     pthread_cond_init (&pComponentPrivate->InLoaded_threshold, NULL);
    335     pComponentPrivate->InLoaded_readytoidle = 0;
    336 
    337     pthread_mutex_init(&pComponentPrivate->InIdle_mutex, NULL);
    338     pthread_cond_init (&pComponentPrivate->InIdle_threshold, NULL);
    339     pComponentPrivate->InIdle_goingtoloaded = 0;
    340 #else
    341     OMX_CreateEvent(&(pComponentPrivate->AlloBuf_event));
    342     pComponentPrivate->AlloBuf_waitingsignal = 0;
    343 
    344     OMX_CreateEvent(&(pComponentPrivate->InLoaded_event));
    345     pComponentPrivate->InLoaded_readytoidle = 0;
    346 
    347     OMX_CreateEvent(&(pComponentPrivate->InIdle_event));
    348     pComponentPrivate->InIdle_goingtoloaded = 0;
    349 #endif
    350     /* Removing sleep() calls. Initialization.*/
    351     G711D_OMX_MALLOC(pPortDef_ip, OMX_PARAM_PORTDEFINITIONTYPE);
    352     G711D_OMX_MALLOC(pPortDef_op, OMX_PARAM_PORTDEFINITIONTYPE);
    353 
    354     G711DEC_DPRINT ("%d ::pPortDef_ip = 0x%x\n", __LINE__,(unsigned int)pPortDef_ip);
    355     G711DEC_DPRINT ("%d ::pPortDef_op = 0x%x\n", __LINE__,(unsigned int)pPortDef_op);
    356 
    357     pComponentPrivate->pPortDef[G711DEC_INPUT_PORT] = pPortDef_ip;
    358     pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT] = pPortDef_op;
    359 
    360     pPortDef_ip->nSize                              = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
    361     pPortDef_ip->nPortIndex                         = 0x0;
    362     pPortDef_ip->nBufferCountActual                 = NUM_G711DEC_INPUT_BUFFERS;
    363     pPortDef_ip->nBufferCountMin                    = NUM_G711DEC_INPUT_BUFFERS;
    364     pPortDef_ip->eDir                               = OMX_DirInput;
    365     pPortDef_ip->bEnabled                           = OMX_TRUE;
    366     pPortDef_ip->nBufferSize                        = INPUT_G711DEC_BUFFER_SIZE;
    367     pPortDef_ip->bPopulated                         = 0;
    368     pPortDef_ip->eDomain                            = OMX_PortDomainAudio;
    369     pPortDef_ip->format.audio.eEncoding             = OMX_AUDIO_CodingG711;
    370     pPortDef_ip->format.audio.cMIMEType             = NULL;
    371     pPortDef_ip->format.audio.pNativeRender         = NULL;
    372     pPortDef_ip->format.audio.bFlagErrorConcealment = OMX_FALSE;
    373 
    374 
    375     pPortDef_op->nSize                              = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
    376     pPortDef_op->nPortIndex                         = 0x1;
    377     pPortDef_op->nBufferCountActual                 = NUM_G711DEC_OUTPUT_BUFFERS;
    378     pPortDef_op->nBufferCountMin                    = NUM_G711DEC_OUTPUT_BUFFERS;
    379     pPortDef_op->eDir                               = OMX_DirOutput;
    380     pPortDef_op->bEnabled                           = OMX_TRUE;
    381     pPortDef_op->nBufferSize                        = OUTPUT_G711DEC_BUFFER_SIZE;
    382     pPortDef_op->bPopulated                         = 0;
    383     pPortDef_op->eDomain                            = OMX_PortDomainAudio;
    384     pPortDef_op->format.audio.eEncoding             = OMX_AUDIO_CodingPCM;
    385     pPortDef_op->format.audio.cMIMEType             = NULL;
    386     pPortDef_op->format.audio.pNativeRender         = NULL;
    387     pPortDef_op->format.audio.bFlagErrorConcealment = OMX_FALSE;
    388 
    389     pComponentPrivate->sInPortFormat.nPortIndex    = G711DEC_INPUT_PORT;
    390     pComponentPrivate->sInPortFormat.nIndex        = OMX_IndexParamAudioPcm;
    391     pComponentPrivate->sInPortFormat.eEncoding     = OMX_AUDIO_CodingG711;
    392 
    393     pComponentPrivate->sOutPortFormat.nPortIndex    = G711DEC_OUTPUT_PORT;
    394     pComponentPrivate->sOutPortFormat.nIndex        = OMX_IndexParamAudioPcm;
    395     pComponentPrivate->sOutPortFormat.eEncoding     = OMX_AUDIO_CodingPCM;
    396 
    397     G711D_OMX_MALLOC(pComponentPrivate->pCompPort[G711DEC_INPUT_PORT]->pPortFormat, OMX_AUDIO_PARAM_PORTFORMATTYPE);
    398     OMX_NBCONF_INIT_STRUCT(pComponentPrivate->pCompPort[G711DEC_INPUT_PORT]->pPortFormat, OMX_AUDIO_PARAM_PORTFORMATTYPE);
    399     /* Set input port format defaults */
    400     pInPortFormatArr = pComponentPrivate->pCompPort[G711DEC_INPUT_PORT]->pPortFormat;
    401     OMX_NBCONF_INIT_STRUCT(pInPortFormatArr, OMX_AUDIO_PARAM_PORTFORMATTYPE);
    402     pInPortFormatArr->nPortIndex         = G711DEC_INPUT_PORT;
    403     pInPortFormatArr->nIndex             = OMX_IndexParamAudioPcm;
    404     pInPortFormatArr->eEncoding          = OMX_AUDIO_CodingG711;
    405 
    406     G711D_OMX_MALLOC(pComponentPrivate->pCompPort[G711DEC_OUTPUT_PORT]->pPortFormat, OMX_AUDIO_PARAM_PORTFORMATTYPE);
    407     OMX_NBCONF_INIT_STRUCT(pComponentPrivate->pCompPort[G711DEC_OUTPUT_PORT]->pPortFormat, OMX_AUDIO_PARAM_PORTFORMATTYPE);
    408     /* Set output port format defaults */
    409     pOutPortFormatArr = pComponentPrivate->pCompPort[G711DEC_OUTPUT_PORT]->pPortFormat;
    410     OMX_NBCONF_INIT_STRUCT(pOutPortFormatArr, OMX_AUDIO_PARAM_PORTFORMATTYPE);
    411     pOutPortFormatArr->nPortIndex         = G711DEC_OUTPUT_PORT;
    412     pOutPortFormatArr->nIndex             = OMX_IndexParamAudioPcm;
    413     pOutPortFormatArr->eEncoding          = OMX_AUDIO_CodingPCM;
    414 
    415 #ifdef RESOURCE_MANAGER_ENABLED
    416     G711DEC_DPRINT ("%d %s Initialize RM Proxy...\n", __LINE__,__FUNCTION__);
    417     eError = RMProxy_NewInitalize();
    418     G711DEC_DPRINT ("%d ::OMX_ComponentInit\n", __LINE__);
    419     if (eError != OMX_ErrorNone) {
    420         G711DEC_DPRINT ("%d ::Error returned from loading ResourceManagerProxy thread\n", __LINE__);
    421         if( eError == OMX_ErrorInsufficientResources)
    422             G711DEC_PRINT("Error OMX_ErrorInsufficientResources\n");
    423         else
    424             G711DEC_PRINT("eError 0x%x\n", eError);
    425         goto EXIT;
    426     }
    427 #endif
    428 
    429     eError = G711DEC_StartComponentThread(pHandle);
    430     G711DEC_DPRINT ("%d ::OMX_ComponentInit\n", __LINE__);
    431     if (eError != OMX_ErrorNone) {
    432         G711DEC_DPRINT ("%d ::Error returned from the Component\n", __LINE__);
    433         goto EXIT;
    434     }
    435     G711DEC_DPRINT ("%d ::OMX_ComponentInit\n", __LINE__);
    436 
    437 #ifdef DSP_RENDERING_ON
    438 
    439     if((pComponentPrivate->fdwrite=open(FIFO1,O_WRONLY))<0) {
    440         G711DEC_DPRINT("[G711 Dec Component] - failure to open WRITE pipe\n");
    441     }
    442 
    443     if((pComponentPrivate->fdread=open(FIFO2,O_RDONLY))<0) {
    444         G711DEC_DPRINT("[G711 Dec Component] - failure to open READ pipe\n");
    445         goto EXIT;
    446     }
    447     G711DEC_DPRINT ("%d ::OMX_ComponentInit\n", __LINE__);
    448 
    449 #endif
    450  EXIT:
    451     if(eError == OMX_ErrorInsufficientResources)
    452     {
    453         OMX_G711DECMEMFREE_STRUCT(g711_ip);
    454         OMX_G711DECMEMFREE_STRUCT(g711_op);
    455 	 if (pComponentPrivate != NULL) {
    456 	     OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pInputBufferList);
    457 	     OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pOutputBufferList);
    458 	     OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pCompPort[G711DEC_INPUT_PORT]->pPortFormat);
    459 	     OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pCompPort[G711DEC_OUTPUT_PORT]->pPortFormat);
    460 	     OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pCompPort[G711DEC_INPUT_PORT]);
    461 	     OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pCompPort[G711DEC_OUTPUT_PORT]);
    462 	     OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->sDeviceString);
    463 	 }
    464 	 OMX_G711DECMEMFREE_STRUCT(pHandle->pComponentPrivate);
    465         OMX_G711DECMEMFREE_STRUCT(pPortDef_ip);
    466         OMX_G711DECMEMFREE_STRUCT(pPortDef_op);
    467 
    468     }
    469     G711DEC_DPRINT ("%d ::OMX_ComponentInit - returning %d\n", __LINE__,eError);
    470     return eError;
    471 }
    472 
    473 /*-------------------------------------------------------------------*/
    474 /**
    475  *  SetCallbacks() Sets application callbacks to the component
    476  *
    477  * This method will update application callbacks
    478  * to the component. So that component can make use of those call back
    479  * while sending buffers to the application. And also it will copy the
    480  * application private data to component memory
    481  *
    482  * @param pComponent    handle for this instance of the component
    483  * @param pCallBacks    application callbacks
    484  * @param pAppData      Application private data
    485  *
    486  * @retval OMX_NoError              Success, ready to roll
    487  *         OMX_Error_BadParameter   The input parameter pointer is null
    488  **/
    489 /*-------------------------------------------------------------------*/
    490 
    491 static OMX_ERRORTYPE SetCallbacks (OMX_HANDLETYPE pComponent,
    492                                    OMX_CALLBACKTYPE* pCallBacks,
    493                                    OMX_PTR pAppData)
    494 {
    495     OMX_ERRORTYPE eError = OMX_ErrorNone;
    496 
    497     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE*)pComponent;
    498 
    499     G711DEC_COMPONENT_PRIVATE *pComponentPrivate =
    500         (G711DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
    501 
    502     if (pCallBacks == NULL) {
    503         G711DEC_DPRINT("About to return OMX_ErrorBadParameter on line %d\n",__LINE__);
    504         eError = OMX_ErrorBadParameter;
    505         G711DEC_DPRINT ("%d :: Received the empty callbacks from the application\n",__LINE__);
    506         goto EXIT;
    507     }
    508 
    509     /*Copy the callbacks of the application to the component private */
    510     memcpy (&(pComponentPrivate->cbInfo), pCallBacks, sizeof(OMX_CALLBACKTYPE));
    511 
    512     /*copy the application private data to component memory */
    513     pHandle->pApplicationPrivate = pAppData;
    514 
    515     pComponentPrivate->curState = OMX_StateLoaded;
    516 
    517  EXIT:
    518     return eError;
    519 }
    520 
    521 /*-------------------------------------------------------------------*/
    522 /**
    523  *  GetComponentVersion() This will return the component version
    524  *
    525  * This method will retrun the component version
    526  *
    527  * @param hComp               handle for this instance of the component
    528  * @param pCompnentName       Name of the component
    529  * @param pCompnentVersion    handle for this instance of the component
    530  * @param pSpecVersion        application callbacks
    531  * @param pCompnentUUID
    532  *
    533  * @retval OMX_NoError              Success, ready to roll
    534  *         OMX_Error_BadParameter   The input parameter pointer is null
    535  **/
    536 /*-------------------------------------------------------------------*/
    537 
    538 static OMX_ERRORTYPE GetComponentVersion (OMX_HANDLETYPE hComp,
    539                                           OMX_STRING pComponentName,
    540                                           OMX_VERSIONTYPE* pComponentVersion,
    541                                           OMX_VERSIONTYPE* pSpecVersion,
    542                                           OMX_UUIDTYPE* pComponentUUID)
    543 {
    544     OMX_ERRORTYPE eError = OMX_ErrorNone;
    545 
    546     eError = OMX_ErrorNotImplemented;
    547     G711DEC_DPRINT (stderr, "Inside the GetComponentVersion\n");
    548     return eError;
    549 
    550 }
    551 
    552 
    553 /*-------------------------------------------------------------------*/
    554 /**
    555  *  SendCommand() used to send the commands to the component
    556  *
    557  * This method will be used by the application.
    558  *
    559  * @param phandle         handle for this instance of the component
    560  * @param Cmd             Command to be sent to the component
    561  * @param nParam          indicates commmad is sent using this method
    562  *
    563  * @retval OMX_NoError              Success, ready to roll
    564  *         OMX_Error_BadParameter   The input parameter pointer is null
    565  **/
    566 /*-------------------------------------------------------------------*/
    567 
    568 static OMX_ERRORTYPE SendCommand (OMX_HANDLETYPE phandle,
    569                                   OMX_COMMANDTYPE Cmd,
    570                                   OMX_U32 nParam,OMX_PTR pCmdData)
    571 {
    572     OMX_ERRORTYPE eError = OMX_ErrorNone;
    573     ssize_t nRet = 0;
    574     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)phandle;
    575     G711DEC_COMPONENT_PRIVATE *pCompPrivate =
    576         (G711DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
    577 
    578     G711DEC_DPRINT ("%d:::Inside SendCommand\n", __LINE__);
    579 
    580     G711DEC_DPRINT("phandle = %p\n", phandle);
    581     G711DEC_DPRINT("pCompPrivate = %p\n", pCompPrivate);
    582 
    583     pCompPrivate->pHandle = phandle;
    584 
    585     if(pCompPrivate->curState == OMX_StateInvalid){
    586         G711DEC_DPRINT ("%d:::Inside SendCommand\n", __LINE__);
    587         eError = OMX_ErrorInvalidState;
    588         G711DEC_DPRINT("%d :: G711DEC: Error Notofication \
    589                                          Sent to App\n",__LINE__);
    590         pCompPrivate->cbInfo.EventHandler (pHandle, pHandle->pApplicationPrivate,
    591                                            OMX_EventError, OMX_ErrorInvalidState,
    592                                            0, "Invalid State");
    593 
    594         goto EXIT;
    595     }
    596 
    597 
    598     switch(Cmd) {
    599     case OMX_CommandStateSet:
    600         G711DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__);
    601         G711DEC_DPRINT ("%d:::pCompPrivate->curState = %d\n",
    602                         __LINE__,pCompPrivate->curState);
    603         if (nParam == OMX_StateLoaded) {
    604             pCompPrivate->bLoadedCommandPending = OMX_TRUE;
    605         }
    606         if(pCompPrivate->curState == OMX_StateLoaded) {
    607             if((nParam == OMX_StateExecuting) || (nParam == OMX_StatePause)) {
    608                 pCompPrivate->cbInfo.EventHandler (pHandle,
    609                                                    pHandle->pApplicationPrivate,
    610                                                    OMX_EventError,
    611                                                    OMX_ErrorIncorrectStateTransition,
    612                                                    0, NULL);
    613                 goto EXIT;
    614             }
    615 
    616             if(nParam == OMX_StateInvalid) {
    617                 G711DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__);
    618                 pCompPrivate->curState = OMX_StateInvalid;
    619                 pCompPrivate->cbInfo.EventHandler (pHandle,
    620                                                    pHandle->pApplicationPrivate,
    621                                                    OMX_EventError,
    622                                                    OMX_ErrorInvalidState,
    623                                                    0, NULL);
    624                 goto EXIT;
    625             }
    626         }
    627         break;
    628     case OMX_CommandFlush:
    629         G711DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__);
    630         if(nParam > 1 && nParam != -1) {
    631             eError = OMX_ErrorBadPortIndex;
    632             goto EXIT;
    633         }
    634 
    635         break;
    636     case OMX_CommandPortDisable:
    637         G711DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__);
    638         break;
    639     case OMX_CommandPortEnable:
    640         G711DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__);
    641         break;
    642     case OMX_CommandMarkBuffer:
    643         G711DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__);
    644         if (nParam > 0) {
    645             eError = OMX_ErrorBadPortIndex;
    646             goto EXIT;
    647         }
    648         break;
    649     default:
    650         G711DEC_DPRINT("%d :: G711DEC: Command Received Default \
    651                                                       error\n",__LINE__);
    652         pCompPrivate->cbInfo.EventHandler (pHandle, pHandle->pApplicationPrivate,
    653                                            OMX_EventError, OMX_ErrorUndefined,0,
    654                                            "Invalid Command");
    655         break;
    656 
    657     }
    658 
    659     G711DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__);
    660     nRet = write (pCompPrivate->cmdPipe[1], &Cmd, sizeof(Cmd));
    661 
    662     if (nRet == -1) {
    663         G711DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__);
    664         eError = OMX_ErrorInsufficientResources;
    665         goto EXIT;
    666     }
    667 
    668     if (Cmd == OMX_CommandMarkBuffer) {
    669         nRet = write(pCompPrivate->cmdDataPipe[1], &pCmdData, sizeof(OMX_PTR));
    670     }
    671     else {
    672         nRet = write(pCompPrivate->cmdDataPipe[1], &nParam, sizeof(OMX_U32));
    673     }
    674 
    675     G711DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__);
    676     G711DEC_DPRINT ("%d:::nRet = %d\n",__LINE__,nRet);
    677     if (nRet == -1) {
    678         G711DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__);
    679         eError = OMX_ErrorInsufficientResources;
    680         goto EXIT;
    681     }
    682 
    683 #ifdef DSP_RENDERING_ON
    684     if(Cmd == OMX_CommandStateSet && nParam == OMX_StateExecuting)
    685     {
    686         /* enable Tee device command*/
    687         cmd_data.hComponent = pHandle;
    688         cmd_data.AM_Cmd = AM_CommandTDNDownlinkMode;
    689         cmd_data.param1 = 0;
    690         cmd_data.param2 = 0;
    691         cmd_data.streamID = 0;
    692         if((write(pCompPrivate->fdwrite, &cmd_data, sizeof(cmd_data)))<0)
    693         {
    694             eError = OMX_ErrorHardware;
    695             goto EXIT;
    696         }
    697     }
    698 #endif
    699 
    700  EXIT:
    701     return eError;
    702 }
    703 /*-------------------------------------------------------------------*/
    704 /**
    705  *  GetParameter() Gets the current configurations of the component
    706  *
    707  * @param hComp         handle for this instance of the component
    708  * @param nParamIndex
    709  * @param ComponentParameterStructure
    710  *
    711  * @retval OMX_NoError              Success, ready to roll
    712  *         OMX_Error_BadParameter   The input parameter pointer is null
    713  **/
    714 /*-------------------------------------------------------------------*/
    715 
    716 static OMX_ERRORTYPE GetParameter (OMX_HANDLETYPE hComp,
    717                                    OMX_INDEXTYPE nParamIndex,
    718                                    OMX_PTR ComponentParameterStructure)
    719 {
    720     OMX_ERRORTYPE eError = OMX_ErrorNone;
    721     G711DEC_COMPONENT_PRIVATE  *pComponentPrivate = NULL;
    722     OMX_PARAM_PORTDEFINITIONTYPE *pParameterStructure = NULL;
    723 
    724     G711DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__);
    725     G711DEC_DPRINT("%d :: Inside the GetParameter:: %x\n",__LINE__,nParamIndex);
    726 
    727     pComponentPrivate = (G711DEC_COMPONENT_PRIVATE *)(((OMX_COMPONENTTYPE*)hComp)->pComponentPrivate);
    728     pParameterStructure = (OMX_PARAM_PORTDEFINITIONTYPE*)ComponentParameterStructure;
    729 
    730     if (pParameterStructure == NULL) {
    731         eError = OMX_ErrorBadParameter;
    732         goto EXIT;
    733 
    734     }
    735 
    736     G711DEC_DPRINT("pParameterStructure = %p\n",pParameterStructure);
    737     G711DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__);
    738 
    739     if(pComponentPrivate->curState == OMX_StateInvalid) {
    740         pComponentPrivate->cbInfo.EventHandler(
    741                                                hComp,
    742                                                ((OMX_COMPONENTTYPE *)hComp)->pApplicationPrivate,
    743                                                OMX_EventError,
    744                                                OMX_ErrorIncorrectStateOperation,
    745                                                0, NULL);
    746 
    747         G711DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__);
    748     }
    749 
    750     G711DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__);
    751 
    752     switch(nParamIndex){
    753 
    754     case OMX_IndexParamAudioInit:
    755         G711DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__);
    756         G711DEC_DPRINT ("OMX_IndexParamAudioInit\n");
    757         memcpy(ComponentParameterStructure,
    758                &pComponentPrivate->sPortParam,
    759                sizeof(OMX_PORT_PARAM_TYPE));
    760         break;
    761 
    762     case OMX_IndexParamPortDefinition:
    763         G711DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__);
    764         G711DEC_DPRINT ("pParameterStructure->nPortIndex = %d\n",(int)pParameterStructure->nPortIndex);
    765         G711DEC_DPRINT ("pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->nPortIndex = %d\n",(int)pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->nPortIndex);
    766 
    767         if(((OMX_PARAM_PORTDEFINITIONTYPE *)(ComponentParameterStructure))->nPortIndex ==
    768            pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->nPortIndex)
    769         {
    770             G711DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__);
    771 
    772             memcpy(ComponentParameterStructure,
    773                    pComponentPrivate->pPortDef[G711DEC_INPUT_PORT],
    774                    sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
    775 
    776             G711DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__);
    777 
    778         } else if(((OMX_PARAM_PORTDEFINITIONTYPE *)(ComponentParameterStructure))->nPortIndex ==
    779                   pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->nPortIndex)
    780         {
    781             G711DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__);
    782 
    783             memcpy(ComponentParameterStructure,
    784                    pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT],
    785                    sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
    786             G711DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__);
    787 
    788         } else {
    789             G711DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__);
    790             eError = OMX_ErrorBadPortIndex;
    791         }
    792         break;
    793 
    794     case OMX_IndexParamAudioPortFormat:
    795         G711DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__);
    796         G711DEC_DPRINT ("((OMX_AUDIO_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nPortIndex = %d\n",(int)((OMX_AUDIO_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nPortIndex);
    797         G711DEC_DPRINT ("pComponentPrivate->sInPortFormat.nPortIndex= %d\n",(int)pComponentPrivate->sInPortFormat.nPortIndex );
    798         G711DEC_DPRINT ("pComponentPrivate->sOutPortFormat.nPortIndex= %d\n",(int)pComponentPrivate->sOutPortFormat.nPortIndex);
    799 
    800         if(((OMX_AUDIO_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nPortIndex ==
    801            pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->nPortIndex)
    802         {
    803 
    804             G711DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__);
    805 
    806             if(((OMX_AUDIO_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nIndex >
    807                pComponentPrivate->sInPortFormat.nIndex)
    808             {
    809                 eError = OMX_ErrorNoMore;
    810             }
    811 
    812             else{
    813                 memcpy(ComponentParameterStructure, &pComponentPrivate->sInPortFormat,
    814                        sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE));
    815             }
    816         }
    817         else if(((OMX_AUDIO_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nPortIndex ==
    818                 pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->nPortIndex){
    819 
    820             G711DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__);
    821 
    822             if(((OMX_AUDIO_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nIndex >
    823                pComponentPrivate->sOutPortFormat.nIndex)
    824             {
    825                 G711DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__);
    826                 eError = OMX_ErrorNoMore;
    827             }
    828             else{
    829                 G711DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__);
    830                 memcpy(ComponentParameterStructure, &pComponentPrivate->sOutPortFormat,
    831                        sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE));
    832             }
    833         }
    834         else{
    835             G711DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__);
    836             eError = OMX_ErrorBadPortIndex;
    837         }
    838         break;
    839 
    840     case OMX_IndexParamAudioPcm:
    841         G711DEC_DPRINT("%d :: GetParameter OMX_IndexParamAudioPcmG711 \n",__LINE__);
    842         if(((OMX_AUDIO_PARAM_PCMMODETYPE *)(ComponentParameterStructure))->nPortIndex ==
    843            pComponentPrivate->g711Params[G711DEC_INPUT_PORT]->nPortIndex){
    844             G711DEC_DPRINT("%d :: GetParameter OMX_IndexParamAudioPcmG711 \n",__LINE__);
    845             memcpy(ComponentParameterStructure,
    846                    pComponentPrivate->g711Params[G711DEC_INPUT_PORT],
    847                    sizeof(OMX_AUDIO_PARAM_PCMMODETYPE));
    848 
    849         } else if(((OMX_AUDIO_PARAM_PCMMODETYPE *)(ComponentParameterStructure))->nPortIndex ==
    850                   pComponentPrivate->g711Params[G711DEC_OUTPUT_PORT]->nPortIndex){
    851             G711DEC_DPRINT("%d :: GetParameter OMX_IndexParamAudioPcmG711 \n",__LINE__);
    852             memcpy(ComponentParameterStructure,
    853                    pComponentPrivate->g711Params[G711DEC_OUTPUT_PORT],
    854                    sizeof(OMX_AUDIO_PARAM_PCMMODETYPE));
    855 
    856         } else {
    857             eError = OMX_ErrorBadPortIndex;
    858         }
    859         break;
    860 
    861     case OMX_IndexParamCompBufferSupplier:
    862         if(((OMX_PARAM_BUFFERSUPPLIERTYPE *)(ComponentParameterStructure))->nPortIndex == OMX_DirInput) {
    863             G711DEC_DPRINT(":: GetParameter OMX_IndexParamCompBufferSupplier \n");
    864         }
    865         else
    866             if(((OMX_PARAM_BUFFERSUPPLIERTYPE *)(ComponentParameterStructure))->nPortIndex == OMX_DirOutput) {
    867                 G711DEC_DPRINT(":: GetParameter OMX_IndexParamCompBufferSupplier \n");
    868             }
    869             else {
    870                 G711DEC_DPRINT(":: OMX_ErrorBadPortIndex from GetParameter");
    871                 eError = OMX_ErrorBadPortIndex;
    872             }
    873         break;
    874 
    875     case OMX_IndexParamPriorityMgmt:
    876         break;
    877 
    878     case OMX_IndexParamVideoInit:
    879         break;
    880 
    881     case OMX_IndexParamImageInit:
    882         break;
    883 
    884     case OMX_IndexParamOtherInit:
    885         break;
    886 
    887 
    888     default:
    889         eError = OMX_ErrorUnsupportedIndex;
    890         break;
    891     }
    892  EXIT:
    893     G711DEC_DPRINT("%d :: Exiting GetParameter:: %x\n",__LINE__,nParamIndex);
    894     return eError;
    895 }
    896 
    897 /*-------------------------------------------------------------------*/
    898 /**
    899  *  SetParameter() Sets configuration paramets to the component
    900  *
    901  * @param hComp         handle for this instance of the component
    902  * @param nParamIndex
    903  * @param pCompParam
    904  *
    905  * @retval OMX_NoError              Success, ready to roll
    906  *         OMX_Error_BadParameter   The input parameter pointer is null
    907  **/
    908 /*-------------------------------------------------------------------*/
    909 
    910 static OMX_ERRORTYPE    SetParameter (OMX_HANDLETYPE hComp,
    911                                       OMX_INDEXTYPE nParamIndex,
    912                                       OMX_PTR pCompParam)
    913 {
    914     OMX_ERRORTYPE eError = OMX_ErrorNone;
    915 
    916     OMX_COMPONENTTYPE* pHandle= (OMX_COMPONENTTYPE*)hComp;
    917     OMX_AUDIO_PARAM_PORTFORMATTYPE* pComponentParam = NULL;
    918     G711DEC_COMPONENT_PRIVATE  *pComponentPrivate = NULL;
    919 
    920     OMX_PARAM_COMPONENTROLETYPE  *pRole = NULL;
    921     OMX_PARAM_BUFFERSUPPLIERTYPE sBufferSupplier;
    922     pComponentPrivate = (G711DEC_COMPONENT_PRIVATE *)(((OMX_COMPONENTTYPE*)hComp)->pComponentPrivate);
    923 
    924     if (pCompParam == NULL) {
    925         eError = OMX_ErrorBadParameter;
    926         goto EXIT;
    927     }
    928 
    929     switch(nParamIndex) {
    930     case OMX_IndexParamAudioPortFormat:
    931         G711DEC_DPRINT("%d :: SetParameter OMX_IndexParamAudioPortFormat \n",__LINE__);
    932         pComponentParam = (OMX_AUDIO_PARAM_PORTFORMATTYPE *)pCompParam;
    933         if ( pComponentParam->nPortIndex == pComponentPrivate->pCompPort[G711DEC_INPUT_PORT]->pPortFormat->nPortIndex )
    934         {
    935             memcpy(pComponentPrivate->pCompPort[G711DEC_INPUT_PORT]->pPortFormat, pComponentParam, sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE));
    936         }
    937         else if ( pComponentParam->nPortIndex == pComponentPrivate->pCompPort[G711DEC_OUTPUT_PORT]->pPortFormat->nPortIndex )
    938         {
    939             memcpy(pComponentPrivate->pCompPort[G711DEC_OUTPUT_PORT]->pPortFormat, pComponentParam, sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE));
    940         }
    941         else
    942         {
    943             G711DEC_DPRINT("%d :: OMX_ErrorBadPortIndex from SetParameter",__LINE__);
    944             eError = OMX_ErrorBadPortIndex;
    945         }
    946 
    947         break;
    948     case OMX_IndexParamAudioPcm:
    949         {
    950             OMX_AUDIO_PARAM_PCMMODETYPE *pCompG711Param =
    951                 (OMX_AUDIO_PARAM_PCMMODETYPE *)pCompParam;
    952 
    953             /* Input port */
    954             if(pCompG711Param->nPortIndex == OMX_DirInput) {
    955                 memcpy(((G711DEC_COMPONENT_PRIVATE*)
    956                         pHandle->pComponentPrivate)->g711Params[G711DEC_INPUT_PORT],
    957                        pCompG711Param, sizeof(OMX_AUDIO_PARAM_PCMMODETYPE));
    958 
    959             } else if (pCompG711Param->nPortIndex == OMX_DirOutput) {
    960                 /* Output port */
    961                 memcpy(((G711DEC_COMPONENT_PRIVATE *)
    962                         pHandle->pComponentPrivate)->g711Params[G711DEC_OUTPUT_PORT],
    963                        pCompG711Param, sizeof(OMX_AUDIO_PARAM_PCMMODETYPE));
    964             }
    965             else {
    966                 eError = OMX_ErrorBadPortIndex;
    967             }
    968         }
    969         break;
    970     case OMX_IndexParamPortDefinition:
    971         if(((OMX_PARAM_PORTDEFINITIONTYPE *)(pCompParam))->nPortIndex ==
    972            pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->nPortIndex) {
    973 
    974             memcpy(pComponentPrivate->pPortDef[G711DEC_INPUT_PORT],
    975                    pCompParam, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
    976 
    977         }
    978         else if(((OMX_PARAM_PORTDEFINITIONTYPE *)(pCompParam))->nPortIndex ==
    979                 pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->nPortIndex) {
    980 
    981             memcpy(pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT],
    982                    pCompParam,sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
    983 
    984         }
    985         else {
    986             eError = OMX_ErrorBadPortIndex;
    987         }
    988         break;
    989 
    990     case OMX_IndexParamPriorityMgmt:
    991         if (pComponentPrivate->curState != OMX_StateLoaded) {
    992             eError = OMX_ErrorIncorrectStateOperation;
    993         }
    994         break;
    995 
    996     case OMX_IndexParamStandardComponentRole:
    997         if (pCompParam) {
    998             pRole = (OMX_PARAM_COMPONENTROLETYPE *)pCompParam;
    999             memcpy(&(pComponentPrivate->componentRole), (void *)pRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
   1000         } else {
   1001             eError = OMX_ErrorBadParameter;
   1002         }
   1003         break;
   1004 
   1005     case OMX_IndexParamCompBufferSupplier:
   1006         if(((OMX_PARAM_PORTDEFINITIONTYPE *)(pCompParam))->nPortIndex ==
   1007            pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->nPortIndex) {
   1008             G711DEC_DPRINT(":: SetParameter OMX_IndexParamCompBufferSupplier \n");
   1009             sBufferSupplier.eBufferSupplier = OMX_BufferSupplyInput;
   1010             memcpy(&sBufferSupplier, pCompParam,
   1011                    sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE));
   1012         }
   1013         else if(((OMX_PARAM_PORTDEFINITIONTYPE *)(pCompParam))->nPortIndex ==
   1014                 pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->nPortIndex) {
   1015             G711DEC_DPRINT(":: SetParameter OMX_IndexParamCompBufferSupplier \n");
   1016             sBufferSupplier.eBufferSupplier = OMX_BufferSupplyOutput;
   1017             memcpy(&sBufferSupplier, pCompParam, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE));
   1018         }
   1019         else {
   1020             G711DEC_DPRINT(":: OMX_ErrorBadPortIndex from SetParameter");
   1021             eError = OMX_ErrorBadPortIndex;
   1022         }
   1023         break;
   1024 
   1025     default:
   1026         break;
   1027 
   1028     }
   1029  EXIT:
   1030     return eError;
   1031 }
   1032 /*-------------------------------------------------------------------*/
   1033 /**
   1034  *  GetConfig() Gets the current configuration of to the component
   1035  *
   1036  * @param hComp         handle for this instance of the component
   1037  * @param nConfigIndex
   1038  * @param ComponentConfigStructure
   1039  *
   1040  * @retval OMX_NoError              Success, ready to roll
   1041  *         OMX_Error_BadParameter   The input parameter pointer is null
   1042  **/
   1043 /*-------------------------------------------------------------------*/
   1044 
   1045 static OMX_ERRORTYPE GetConfig (OMX_HANDLETYPE hComp,
   1046                                 OMX_INDEXTYPE nConfigIndex,
   1047                                 OMX_PTR ComponentConfigStructure)
   1048 {
   1049     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1050 
   1051     G711DEC_COMPONENT_PRIVATE *pComponentPrivate = NULL;
   1052 
   1053     pComponentPrivate = (G711DEC_COMPONENT_PRIVATE *)
   1054         (((OMX_COMPONENTTYPE*)hComp)->pComponentPrivate);
   1055     if ((pComponentPrivate != NULL) && (ComponentConfigStructure != NULL))
   1056         memcpy(ComponentConfigStructure,pComponentPrivate,sizeof(G711DEC_COMPONENT_PRIVATE));
   1057 
   1058     return eError;
   1059 }
   1060 /*-------------------------------------------------------------------*/
   1061 /**
   1062  *  SetConfig() Sets the configraiton to the component
   1063  *
   1064  * @param hComp         handle for this instance of the component
   1065  * @param nConfigIndex
   1066  * @param ComponentConfigStructure
   1067  *
   1068  * @retval OMX_NoError              Success, ready to roll
   1069  *         OMX_Error_BadParameter   The input parameter pointer is null
   1070  **/
   1071 /*-------------------------------------------------------------------*/
   1072 
   1073 static OMX_ERRORTYPE SetConfig (OMX_HANDLETYPE hComp,
   1074                                 OMX_INDEXTYPE nConfigIndex,
   1075                                 OMX_PTR ComponentConfigStructure)
   1076 {
   1077     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1078     OMX_S16* deviceString = NULL;
   1079     TI_OMX_DATAPATH dataPath;
   1080     OMX_COMPONENTTYPE* pHandle = (OMX_COMPONENTTYPE*)hComp;
   1081     G711DEC_COMPONENT_PRIVATE *pComponentPrivate = NULL;
   1082 
   1083     int *customFlag = NULL;
   1084     TI_OMX_DSP_DEFINITION *configData = NULL;
   1085     G711DEC_FTYPES *confFrameParams = NULL;
   1086     OMX_AUDIO_CONFIG_MUTETYPE *pMuteStructure = NULL;
   1087     OMX_AUDIO_CONFIG_VOLUMETYPE *pVolumeStructure = NULL;
   1088 
   1089     G711DEC_DPRINT("%d :: Entering SetConfig\n", __LINE__);
   1090 
   1091     if (pHandle == NULL) {
   1092         G711DEC_DPRINT ("%d :: Invalid HANDLE OMX_ErrorBadParameter \n",__LINE__);
   1093         eError = OMX_ErrorBadParameter;
   1094         goto EXIT;
   1095     }
   1096 
   1097     pComponentPrivate = (G711DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
   1098     switch (nConfigIndex) {
   1099     case  OMX_IndexCustomG711DecHeaderInfoConfig:
   1100         {
   1101             G711DEC_DPRINT("%d :: SetConfig OMX_IndexCustomG711DecHeaderInfoConfig \n",__LINE__);
   1102             configData = (TI_OMX_DSP_DEFINITION*)ComponentConfigStructure;
   1103             if (configData == NULL) {
   1104                 eError = OMX_ErrorBadParameter;
   1105                 G711DEC_DPRINT("%d :: OMX_ErrorBadParameter from SetConfig\n",__LINE__);
   1106                 goto EXIT;
   1107             }
   1108             pComponentPrivate->acdnmode = configData->acousticMode;
   1109             pComponentPrivate->dasfmode = configData->dasfMode;
   1110 
   1111             if (pComponentPrivate->dasfmode ){
   1112                 pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bEnabled = 0;
   1113             }
   1114 
   1115             pComponentPrivate->streamID = configData->streamId;
   1116             G711DEC_DPRINT("pComponentPrivate->acdnmode = %d\n",pComponentPrivate->acdnmode);
   1117             G711DEC_DPRINT("pComponentPrivate->dasfmode = %d\n",pComponentPrivate->dasfmode);
   1118 
   1119             break;
   1120         }
   1121     case OMX_IndexCustomG711DecModeAcdnConfig:
   1122         {
   1123             G711DEC_DPRINT("%d :: SetConfig OMX_IndexCustomG711DecModeAcdnConfig \n",__LINE__);
   1124             customFlag = (int*)ComponentConfigStructure;
   1125             if (customFlag == NULL) {
   1126                 eError = OMX_ErrorBadParameter;
   1127                 G711DEC_DPRINT("%d :: OMX_ErrorBadParameter from SetConfig\n",__LINE__);
   1128                 goto EXIT;
   1129             }
   1130             pComponentPrivate->acdnmode = *customFlag;
   1131             G711DEC_DPRINT("pComponentPrivate->acdnmode = %d\n",pComponentPrivate->acdnmode);
   1132             break;
   1133         }
   1134     case OMX_IndexCustomG711DecModeDasfConfig:
   1135         {
   1136             G711DEC_DPRINT("%d :: SetConfig OMX_IndexCustomG711DecModeDasfConfig \n",__LINE__);
   1137             customFlag = (int*)ComponentConfigStructure;
   1138             if (customFlag == NULL) {
   1139                 eError = OMX_ErrorBadParameter;
   1140                 G711DEC_DPRINT("%d :: OMX_ErrorBadParameter from SetConfig\n",__LINE__);
   1141                 goto EXIT;
   1142             }
   1143             pComponentPrivate->dasfmode = *customFlag;
   1144             G711DEC_DPRINT("pComponentPrivate->dasfmode = %d\n",pComponentPrivate->dasfmode);
   1145             if (pComponentPrivate->dasfmode ){
   1146                 pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bEnabled = 0;
   1147             }
   1148             break;
   1149         }
   1150 
   1151     case OMX_IndexCustomG711DecFrameParams:
   1152         {
   1153             confFrameParams = (G711DEC_FTYPES*)ComponentConfigStructure;
   1154             pComponentPrivate->ftype = confFrameParams->FrameSizeType;
   1155             pComponentPrivate->nmulevel = confFrameParams->NmuNLvl;
   1156             pComponentPrivate->noiselp = confFrameParams->NoiseLp;
   1157             pComponentPrivate->dbmnoise = confFrameParams->dBmNoise;
   1158             pComponentPrivate->packetlostc = confFrameParams->plc;
   1159             break;
   1160         }
   1161 
   1162     case  OMX_IndexCustomG711DecDataPath:
   1163         deviceString = (OMX_S16*)ComponentConfigStructure;
   1164         if (deviceString == NULL)
   1165         {
   1166             eError = OMX_ErrorBadParameter;
   1167             goto EXIT;
   1168         }
   1169 
   1170         dataPath = *deviceString;
   1171 
   1172         switch(dataPath)
   1173         {
   1174         case DATAPATH_APPLICATION:
   1175             OMX_MMMIXER_DATAPATH(pComponentPrivate->sDeviceString, RENDERTYPE_DECODER, pComponentPrivate->streamID);
   1176             break;
   1177 
   1178         case DATAPATH_APPLICATION_RTMIXER:
   1179             strcpy((char*)pComponentPrivate->sDeviceString,(char*)RTM_STRING);
   1180             break;
   1181 
   1182         case DATAPATH_ACDN:
   1183             strcpy((char*)pComponentPrivate->sDeviceString,(char*)ACDN_STRING);
   1184             break;
   1185 
   1186         default:
   1187             break;
   1188         }
   1189         break;
   1190 
   1191 #ifdef DSP_RENDERING_ON
   1192     case OMX_IndexConfigAudioMute:
   1193         {
   1194             pMuteStructure = (OMX_AUDIO_CONFIG_MUTETYPE *)ComponentConfigStructure;
   1195             G711DEC_PRINT("Set Mute/Unmute for playback stream\n");
   1196             cmd_data.hComponent = hComp;
   1197             if(pMuteStructure->bMute == OMX_TRUE)
   1198             {
   1199                 G711DEC_PRINT("Mute the playback stream\n");
   1200                 cmd_data.AM_Cmd = AM_CommandStreamMute;
   1201             }
   1202             else
   1203             {
   1204                 G711DEC_PRINT("unMute the playback stream\n");
   1205                 cmd_data.AM_Cmd = AM_CommandStreamUnMute;
   1206             }
   1207             cmd_data.param1 = 0;
   1208             cmd_data.param2 = 0;
   1209             cmd_data.streamID = pComponentPrivate->streamID;
   1210             if((write(pComponentPrivate->fdwrite, &cmd_data, sizeof(cmd_data)))<0)
   1211             {
   1212                 G711DEC_DPRINT("[G711 decoder] - fail to send Mute command to audio manager\n");
   1213                 G711DEC_PRINT("No pudo escribir al Pipe del Audio Manager\n");
   1214             }
   1215 
   1216             break;
   1217         }
   1218     case OMX_IndexConfigAudioVolume:
   1219         {
   1220             pVolumeStructure = (OMX_AUDIO_CONFIG_VOLUMETYPE *)ComponentConfigStructure;
   1221             G711DEC_PRINT("Set volume for playback stream\n");
   1222             cmd_data.hComponent = hComp;
   1223             cmd_data.AM_Cmd = AM_CommandSWGain;
   1224             cmd_data.param1 = pVolumeStructure->sVolume.nValue;
   1225             cmd_data.param2 = 0;
   1226             cmd_data.streamID = pComponentPrivate->streamID;
   1227 
   1228             if((write(pComponentPrivate->fdwrite, &cmd_data, sizeof(cmd_data)))<0)
   1229             {
   1230                 G711DEC_DPRINT("[G711 decoder] - fail to send Volume command to audio manager\n");
   1231             }
   1232 
   1233             break;
   1234         }
   1235 #endif
   1236     default:
   1237         eError = OMX_ErrorUnsupportedIndex;
   1238         break;
   1239     }
   1240  EXIT:
   1241     G711DEC_DPRINT("%d :: Exiting SetConfig\n", __LINE__);
   1242     G711DEC_DPRINT("%d :: Returning = 0x%x\n",__LINE__,eError);
   1243     return eError;
   1244 
   1245 }
   1246 /*-------------------------------------------------------------------*/
   1247 /**
   1248  *  GetState() Gets the current state of the component
   1249  *
   1250  * @param pCompomponent handle for this instance of the component
   1251  * @param pState
   1252  *
   1253  * @retval OMX_NoError              Success, ready to roll
   1254  *         OMX_Error_BadParameter   The input parameter pointer is null
   1255  **/
   1256 /*-------------------------------------------------------------------*/
   1257 
   1258 static OMX_ERRORTYPE GetState (OMX_HANDLETYPE pComponent, OMX_STATETYPE* pState)
   1259 {
   1260     OMX_ERRORTYPE error = OMX_ErrorUndefined;
   1261     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent;
   1262 
   1263     if (!pState) {
   1264         error = OMX_ErrorBadParameter;
   1265         G711DEC_DPRINT("About to return OMX_ErrorBadParameter on line %d\n",__LINE__);
   1266         goto EXIT;
   1267     }
   1268 
   1269     if (pHandle && pHandle->pComponentPrivate) {
   1270         *pState =  ((G711DEC_COMPONENT_PRIVATE*)
   1271                     pHandle->pComponentPrivate)->curState;
   1272     } else {
   1273         *pState = OMX_StateLoaded;
   1274     }
   1275 
   1276     error = OMX_ErrorNone;
   1277 
   1278  EXIT:
   1279     return error;
   1280 }
   1281 
   1282 /*-------------------------------------------------------------------*/
   1283 /**
   1284  *  EmptyThisBuffer() This callback is used to send the input buffer to
   1285  *  component
   1286  *
   1287  * @param pComponent       handle for this instance of the component
   1288  * @param nPortIndex       input port index
   1289  * @param pBuffer          buffer to be sent to codec
   1290  *
   1291  * @retval OMX_NoError              Success, ready to roll
   1292  *         OMX_Error_BadParameter   The input parameter pointer is null
   1293  **/
   1294 /*-------------------------------------------------------------------*/
   1295 
   1296 static OMX_ERRORTYPE EmptyThisBuffer (OMX_HANDLETYPE pComponent,
   1297                                       OMX_BUFFERHEADERTYPE* pBuffer)
   1298 {
   1299     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1300     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent;
   1301     G711DEC_COMPONENT_PRIVATE *pComponentPrivate =
   1302         (G711DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
   1303 
   1304     OMX_PARAM_PORTDEFINITIONTYPE *pPortDef = NULL;
   1305 
   1306     ssize_t ret = 0;
   1307     pPortDef = ((G711DEC_COMPONENT_PRIVATE*)
   1308                 pComponentPrivate)->pPortDef[G711DEC_INPUT_PORT];
   1309 
   1310     if(!pPortDef->bEnabled) {
   1311         G711DEC_DPRINT("About to return OMX_ErrorIncorrectStateOperation Line %d\n",__LINE__);
   1312         eError = OMX_ErrorIncorrectStateOperation;
   1313         goto EXIT;
   1314     }
   1315 
   1316     if (pBuffer == NULL) {
   1317         eError = OMX_ErrorBadParameter;
   1318         G711DEC_DPRINT("About to return OMX_ErrorBadParameter on line %d\n",__LINE__);
   1319         goto EXIT;
   1320     }
   1321 
   1322     if (pBuffer->nSize != sizeof(OMX_BUFFERHEADERTYPE)) {
   1323         eError = OMX_ErrorBadParameter;
   1324         goto EXIT;
   1325     }
   1326 
   1327     if (pBuffer->nVersion.nVersion != pComponentPrivate->nVersion) {
   1328         eError = OMX_ErrorVersionMismatch;
   1329         goto EXIT;
   1330     }
   1331 
   1332     if (pBuffer->nInputPortIndex != G711DEC_INPUT_PORT) {
   1333         eError  = OMX_ErrorBadPortIndex;
   1334         goto EXIT;
   1335     }
   1336 
   1337     G711DEC_DPRINT("pComponentPrivate->curState = %d\n",pComponentPrivate->curState);
   1338 
   1339     if(pComponentPrivate->curState != OMX_StateExecuting &&
   1340        pComponentPrivate->curState != OMX_StatePause) {
   1341         G711DEC_DPRINT("About to return OMX_ErrorIncorrectStateOperation Line %d\n",__LINE__);
   1342         eError = OMX_ErrorIncorrectStateOperation;
   1343         goto EXIT;
   1344     }
   1345 
   1346     G711DEC_DPRINT("\n------------------------------------------\n\n");
   1347     G711DEC_DPRINT ("%d :: Component Sending Filled ip buff %p \
   1348                              to Component Thread\n",__LINE__,pBuffer);
   1349     G711DEC_DPRINT("\n------------------------------------------\n\n");
   1350 
   1351     pComponentPrivate->app_nBuf--;
   1352 
   1353     pComponentPrivate->pMarkData = pBuffer->pMarkData;
   1354     pComponentPrivate->hMarkTargetComponent = pBuffer->hMarkTargetComponent;
   1355 
   1356     ret = write (pComponentPrivate->dataPipe[1], &pBuffer,
   1357                  sizeof(OMX_BUFFERHEADERTYPE*));
   1358 
   1359     if (ret == -1) {
   1360         G711DEC_DPRINT ("%d :: Error in Writing to the Data pipe\n", __LINE__);
   1361         eError = OMX_ErrorHardware;
   1362         goto EXIT;
   1363     }
   1364     pComponentPrivate->nEmptyThisBufferCount++;
   1365 
   1366  EXIT:
   1367     return eError;
   1368 }
   1369 /*-------------------------------------------------------------------*/
   1370 /**
   1371  *  FillThisBuffer() This callback is used to send the output buffer to
   1372  *  the component
   1373  *
   1374  * @param pComponent    handle for this instance of the component
   1375  * @param nPortIndex    output port number
   1376  * @param pBuffer       buffer to be sent to codec
   1377  *
   1378  * @retval OMX_NoError              Success, ready to roll
   1379  *         OMX_Error_BadParameter   The input parameter pointer is null
   1380  **/
   1381 /*-------------------------------------------------------------------*/
   1382 
   1383 static OMX_ERRORTYPE FillThisBuffer (OMX_HANDLETYPE pComponent,
   1384                                      OMX_BUFFERHEADERTYPE* pBuffer)
   1385 {
   1386     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1387     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent;
   1388     G711DEC_COMPONENT_PRIVATE *pComponentPrivate =
   1389         (G711DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
   1390 
   1391     OMX_PARAM_PORTDEFINITIONTYPE *pPortDef = NULL;
   1392     G711DEC_DPRINT("\n------------------------------------------\n\n");
   1393     G711DEC_DPRINT ("%d :: Component Sending Emptied op buff %p \
   1394                              to Component Thread\n",__LINE__,pBuffer);
   1395     G711DEC_DPRINT("\n------------------------------------------\n\n");
   1396 
   1397     pPortDef = ((G711DEC_COMPONENT_PRIVATE*)
   1398                 pComponentPrivate)->pPortDef[G711DEC_OUTPUT_PORT];
   1399 
   1400     if(!pPortDef->bEnabled) {
   1401         G711DEC_DPRINT("About to return OMX_ErrorIncorrectStateOperation Line %d\n",__LINE__);
   1402         eError = OMX_ErrorIncorrectStateOperation;
   1403         goto EXIT;
   1404     }
   1405 
   1406     if (pBuffer == NULL) {
   1407         eError = OMX_ErrorBadParameter;
   1408         G711DEC_DPRINT("About to return OMX_ErrorBadParameter on line %d\n",__LINE__);
   1409         goto EXIT;
   1410     }
   1411 
   1412     if (pBuffer->nSize != sizeof(OMX_BUFFERHEADERTYPE)) {
   1413         eError = OMX_ErrorBadParameter;
   1414         goto EXIT;
   1415     }
   1416 
   1417 
   1418     if (pBuffer->nVersion.nVersion != pComponentPrivate->nVersion) {
   1419         eError = OMX_ErrorVersionMismatch;
   1420         goto EXIT;
   1421     }
   1422 
   1423     if (pBuffer->nOutputPortIndex != G711DEC_OUTPUT_PORT) {
   1424         eError  = OMX_ErrorBadPortIndex;
   1425         goto EXIT;
   1426     }
   1427 
   1428     G711DEC_DPRINT("pComponentPrivate->curState = %d\n",pComponentPrivate->curState);
   1429 
   1430     if(pComponentPrivate->curState != OMX_StateExecuting && pComponentPrivate->curState != OMX_StatePause) {
   1431         G711DEC_DPRINT("About to return OMX_ErrorIncorrectStateOperation Line %d\n",__LINE__);
   1432         eError = OMX_ErrorIncorrectStateOperation;
   1433         goto EXIT;
   1434     }
   1435 
   1436     G711DEC_DPRINT("FillThisBuffer Line %d\n",__LINE__);
   1437 
   1438     pBuffer->nFilledLen = 0;
   1439 
   1440     G711DEC_DPRINT("FillThisBuffer Line %d\n",__LINE__);
   1441 
   1442     /*Filling the Output buffer with zero */
   1443 #ifndef UNDER_CE
   1444     memset (pBuffer->pBuffer,0,OUTPUT_G711DEC_BUFFER_SIZE);
   1445 #else
   1446     memset (pBuffer->pBuffer,0,pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->nBufferSize);
   1447 #endif
   1448     G711DEC_DPRINT("FillThisBuffer Line %d\n",__LINE__);
   1449 
   1450     pComponentPrivate->app_nBuf--;
   1451 
   1452     G711DEC_DPRINT("%d:Decrementing app_nBuf = %d\n",__LINE__,(int)pComponentPrivate->app_nBuf);
   1453     G711DEC_DPRINT("pComponentPrivate->pMarkBuf = 0x%x\n",(int)pComponentPrivate->pMarkBuf);
   1454     G711DEC_DPRINT("pComponentPrivate->pMarkData = 0x%x\n",(int)pComponentPrivate->pMarkData);
   1455 
   1456     if(pComponentPrivate->pMarkBuf){
   1457         G711DEC_DPRINT("FillThisBuffer Line %d\n",__LINE__);
   1458         pBuffer->hMarkTargetComponent = pComponentPrivate->pMarkBuf->hMarkTargetComponent;
   1459         pBuffer->pMarkData = pComponentPrivate->pMarkBuf->pMarkData;
   1460         pComponentPrivate->pMarkBuf = NULL;
   1461     }
   1462 
   1463     if (pComponentPrivate->pMarkData) {
   1464         G711DEC_DPRINT("FillThisBuffer Line %d\n",__LINE__);
   1465         pBuffer->hMarkTargetComponent = pComponentPrivate->hMarkTargetComponent;
   1466         pBuffer->pMarkData = pComponentPrivate->pMarkData;
   1467         pComponentPrivate->pMarkData = NULL;
   1468     }
   1469 
   1470     write (pComponentPrivate->dataPipe[1], &pBuffer, sizeof (OMX_BUFFERHEADERTYPE*));
   1471     pComponentPrivate->nFillThisBufferCount++;
   1472 
   1473  EXIT:
   1474     return eError;
   1475 }
   1476 /*-------------------------------------------------------------------*/
   1477 /**
   1478  * OMX_ComponentDeinit() this methold will de init the component
   1479  *
   1480  * @param pComp         handle for this instance of the component
   1481  *
   1482  * @retval OMX_NoError              Success, ready to roll
   1483  *         OMX_Error_BadParameter   The input parameter pointer is null
   1484  **/
   1485 /*-------------------------------------------------------------------*/
   1486 
   1487 static OMX_ERRORTYPE ComponentDeInit(OMX_HANDLETYPE pHandle)
   1488 {
   1489     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1490 
   1491     /* inform audio manager to remove the streamID*/
   1492     /* compose the data */
   1493     OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)pHandle;
   1494     G711DEC_COMPONENT_PRIVATE *pComponentPrivate =
   1495         (G711DEC_COMPONENT_PRIVATE *)pComponent->pComponentPrivate;
   1496 
   1497     G711DEC_DPRINT ("%d ::ComponentDeInit\n",__LINE__);
   1498 
   1499 #ifdef DSP_RENDERING_ON
   1500     close(pComponentPrivate->fdwrite);
   1501     close(pComponentPrivate->fdread);
   1502 #endif
   1503 
   1504     OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->sDeviceString);
   1505 
   1506 #ifdef RESOURCE_MANAGER_ENABLED
   1507     RMProxy_NewSendCommand(pHandle, RMProxy_FreeResource,
   1508                            OMX_G711_Decoder_COMPONENT,
   1509                            0, 1234, NULL);
   1510     if (eError != OMX_ErrorNone) {
   1511         G711DEC_DPRINT ("%d ::Error returned from destroy ResourceManagerProxy thread\n",
   1512                         __LINE__);
   1513     }
   1514     eError = RMProxy_Deinitalize();
   1515     if (eError != OMX_ErrorNone) {
   1516         G711DEC_DPRINT ("%d ::Error returned from destroy ResourceManagerProxy thread\n",
   1517                         __LINE__);
   1518     }
   1519 #endif
   1520     G711DEC_DPRINT ("%d ::ComponentDeInit\n",__LINE__);
   1521 
   1522     G711DEC_DPRINT ("%d ::ComponentDeInit\n",__LINE__);
   1523     pComponentPrivate->bIsStopping = 1;
   1524     eError = G711DEC_StopComponentThread(pHandle);
   1525     G711DEC_DPRINT ("%d ::ComponentDeInit\n",__LINE__);
   1526     /* Wait for thread to exit so we can get the status into "error" */
   1527 
   1528     /* close the pipe handles */
   1529     G711DEC_FreeCompResources(pHandle);
   1530     G711DEC_DPRINT ("%d ::After G711DEC_FreeCompResources\n",__LINE__);
   1531     OMX_G711DECMEMFREE_STRUCT(pComponentPrivate);
   1532     G711DEC_DPRINT ("%d ::After free(pComponentPrivate)\n",__LINE__);
   1533 
   1534     return eError;
   1535 }
   1536 
   1537 /*-------------------------------------------------------------------*/
   1538 /**
   1539  *  ComponentTunnelRequest() this method is not implemented in 1.5
   1540  *
   1541  * This method will update application callbacks
   1542  * the application.
   1543  *
   1544  * @param pComp         handle for this instance of the component
   1545  * @param pCallBacks    application callbacks
   1546  * @param ptr
   1547  *
   1548  * @retval OMX_NoError              Success, ready to roll
   1549  *         OMX_Error_BadParameter   The input parameter pointer is null
   1550  **/
   1551 /*-------------------------------------------------------------------*/
   1552 
   1553 static OMX_ERRORTYPE ComponentTunnelRequest (OMX_HANDLETYPE hComp,
   1554                                              OMX_U32 nPort, OMX_HANDLETYPE hTunneledComp,
   1555                                              OMX_U32 nTunneledPort,
   1556                                              OMX_TUNNELSETUPTYPE* pTunnelSetup)
   1557 {
   1558     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1559     G711DEC_DPRINT (stderr, "Inside the ComponentTunnelRequest\n");
   1560     eError = OMX_ErrorNotImplemented;
   1561     return eError;
   1562 }
   1563 
   1564 /*-------------------------------------------------------------------*/
   1565 /**
   1566  *  AllocateBuffer()
   1567 
   1568  * @param pComp         handle for this instance of the component
   1569  * @param pCallBacks    application callbacks
   1570  * @param ptr
   1571  *
   1572  * @retval OMX_NoError              Success, ready to roll
   1573  *         OMX_Error_BadParameter   The input parameter pointer is null
   1574  **/
   1575 /*-------------------------------------------------------------------*/
   1576 
   1577 static OMX_ERRORTYPE AllocateBuffer (OMX_IN OMX_HANDLETYPE hComponent,
   1578                                      OMX_INOUT OMX_BUFFERHEADERTYPE** pBuffer,
   1579                                      OMX_IN OMX_U32 nPortIndex,
   1580                                      OMX_IN OMX_PTR pAppPrivate,
   1581                                      OMX_IN OMX_U32 nSizeBytes)
   1582 
   1583 {
   1584     OMX_PARAM_PORTDEFINITIONTYPE *pPortDef = NULL;
   1585     G711DEC_COMPONENT_PRIVATE *pComponentPrivate = NULL;
   1586     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1587     OMX_BUFFERHEADERTYPE *pBufferHeader = NULL;
   1588 
   1589     pComponentPrivate = (G711DEC_COMPONENT_PRIVATE *)
   1590         (((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate);
   1591 
   1592     pPortDef = ((G711DEC_COMPONENT_PRIVATE*)pComponentPrivate)->pPortDef[nPortIndex];
   1593 
   1594     G711DEC_DPRINT ("%d :: pPortDef = 0x%x\n", __LINE__,(unsigned int)pPortDef);
   1595     G711DEC_DPRINT("%d :: pPortDef->bEnabled = %d\n", __LINE__,pPortDef->bEnabled);
   1596     G711DEC_DPRINT("pPortDef->bEnabled = %d\n", pPortDef->bEnabled);
   1597 
   1598     if(!pPortDef->bEnabled){
   1599         G711DEC_DPRINT ("%d :: BLOCK!! AlloBuf_threshold\n", __LINE__);
   1600         pComponentPrivate->AlloBuf_waitingsignal = 1;
   1601 #ifndef UNDER_CE
   1602         pthread_mutex_lock(&pComponentPrivate->AlloBuf_mutex);
   1603         pthread_cond_wait(&pComponentPrivate->AlloBuf_threshold,
   1604                           &pComponentPrivate->AlloBuf_mutex);
   1605         pthread_mutex_unlock(&pComponentPrivate->AlloBuf_mutex);
   1606 #else
   1607         OMX_WaitForEvent(&(pComponentPrivate->AlloBuf_event));
   1608 #endif
   1609     }
   1610 
   1611     G711D_OMX_MALLOC(pBufferHeader, OMX_BUFFERHEADERTYPE);
   1612     G711D_OMX_MALLOC_SIZE(pBufferHeader->pBuffer, (nSizeBytes + EXTRA_BUFFBYTES), OMX_U8 );
   1613 
   1614 #ifdef UNDER_CE
   1615     memset(pBufferHeader->pBuffer, 0, (nSizeBytes + EXTRA_BUFFBYTES));
   1616 #endif
   1617 
   1618     pBufferHeader->pBuffer += CACHE_ALIGNMENT;
   1619 
   1620     if (nPortIndex == G711DEC_INPUT_PORT) {
   1621         pBufferHeader->nInputPortIndex = nPortIndex;
   1622         pBufferHeader->nOutputPortIndex = -1;
   1623         pComponentPrivate->pInputBufferList->pBufHdr[pComponentPrivate->pInputBufferList->numBuffers] = pBufferHeader;
   1624         pComponentPrivate->pInputBufferList->bBufferPending[pComponentPrivate->pInputBufferList->numBuffers] = 0;
   1625         G711DEC_DPRINT("pComponentPrivate->pInputBufferList->pBufHdr[%d] = %p \n",(int)pComponentPrivate->pInputBufferList->pBufHdr[pComponentPrivate->pInputBufferList->numBuffers]);
   1626         pComponentPrivate->pInputBufferList->bufferOwner[pComponentPrivate->pInputBufferList->numBuffers++] = 1;
   1627         G711DEC_DPRINT("Allocate Buffer Line %d\n",__LINE__);
   1628         G711DEC_DPRINT("pComponentPrivate->pInputBufferList->numBuffers = %d\n",(int)pComponentPrivate->pInputBufferList->numBuffers);
   1629         G711DEC_DPRINT("pPortDef->nBufferCountMin = %d\n",(int)pPortDef->nBufferCountMin);
   1630         if (pComponentPrivate->pInputBufferList->numBuffers == pPortDef->nBufferCountActual) {
   1631             G711DEC_DPRINT("Setting pPortDef->bPopulated = OMX_TRUE for input port\n");
   1632             pPortDef->bPopulated = OMX_TRUE;
   1633         }
   1634     }
   1635     else if (nPortIndex == G711DEC_OUTPUT_PORT) {
   1636         pBufferHeader->nInputPortIndex = -1;
   1637         pBufferHeader->nOutputPortIndex = nPortIndex;
   1638         pComponentPrivate->pOutputBufferList->pBufHdr[pComponentPrivate->pOutputBufferList->numBuffers] = pBufferHeader;
   1639         pComponentPrivate->pOutputBufferList->bBufferPending[pComponentPrivate->pOutputBufferList->numBuffers] = 0;
   1640         G711DEC_DPRINT("pComponentPrivate->pOutputBufferList->pBufHdr[%d] = %p \n",(int)pComponentPrivate->pOutputBufferList->pBufHdr[pComponentPrivate->pOutputBufferList->numBuffers]);
   1641         pComponentPrivate->pOutputBufferList->bufferOwner[pComponentPrivate->pOutputBufferList->numBuffers++] = 1;
   1642         if (pComponentPrivate->pOutputBufferList->numBuffers == pPortDef->nBufferCountActual) {
   1643             G711DEC_DPRINT("Setting pPortDef->bPopulated = OMX_TRUE for input port\n");
   1644             pPortDef->bPopulated = OMX_TRUE;
   1645         }
   1646     }
   1647     else {
   1648         eError = OMX_ErrorBadPortIndex;
   1649         goto EXIT;
   1650     }
   1651     if((pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bPopulated ==
   1652         pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bEnabled) &&
   1653        (pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->bPopulated ==
   1654         pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->bEnabled) &&
   1655        (pComponentPrivate->InLoaded_readytoidle))
   1656     {
   1657         pComponentPrivate->InLoaded_readytoidle = 0;
   1658 #ifndef UNDER_CE
   1659         pthread_mutex_lock(&pComponentPrivate->InLoaded_mutex);
   1660         pthread_cond_signal(&pComponentPrivate->InLoaded_threshold);
   1661         pthread_mutex_unlock(&pComponentPrivate->InLoaded_mutex);
   1662 #else
   1663         OMX_SignalEvent(&(pComponentPrivate->InLoaded_event));
   1664 #endif
   1665     }
   1666 
   1667     pBufferHeader->pAppPrivate = pAppPrivate;
   1668     pBufferHeader->pPlatformPrivate = pComponentPrivate;
   1669     pBufferHeader->nAllocLen = nSizeBytes;
   1670     pBufferHeader->nVersion.s.nVersionMajor = G711DEC_MAJOR_VER;
   1671     pBufferHeader->nVersion.s.nVersionMinor = G711DEC_MINOR_VER;
   1672     pComponentPrivate->nVersion = pBufferHeader->nVersion.nVersion;
   1673 
   1674 
   1675     pBufferHeader->nSize = sizeof(OMX_BUFFERHEADERTYPE);
   1676     *pBuffer = pBufferHeader;
   1677 
   1678     if (pComponentPrivate->bEnableCommandPending && pPortDef->bPopulated)
   1679     {
   1680         SendCommand(pComponentPrivate->pHandle,
   1681                     OMX_CommandPortEnable,
   1682                     pComponentPrivate->bEnableCommandParam,
   1683                     NULL);
   1684     }
   1685 
   1686  EXIT:
   1687     G711DEC_DPRINT("AllocateBuffer returning %d\n",eError);
   1688     return eError;
   1689 }
   1690 
   1691 /*------------------------------------------------------------------*/
   1692 /**
   1693  *  FreeBuffer()
   1694 
   1695  * @param hComponent   handle for this instance of the component
   1696  * @param pCallBacks   application callbacks
   1697  * @param ptr
   1698  *
   1699  * @retval OMX_NoError              Success, ready to roll
   1700  *         OMX_Error_BadParameter   The input parameter pointer is null
   1701  **/
   1702 /*-------------------------------------------------------------------*/
   1703 static OMX_ERRORTYPE FreeBuffer(
   1704                                 OMX_IN  OMX_HANDLETYPE hComponent,
   1705                                 OMX_IN  OMX_U32 nPortIndex,
   1706                                 OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer)
   1707 {
   1708     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1709     G711DEC_COMPONENT_PRIVATE * pComponentPrivate = NULL;
   1710     OMX_BUFFERHEADERTYPE* buff = NULL;
   1711     OMX_U8* tempBuff = NULL;
   1712     OMX_S16 i = 0;
   1713     OMX_S16 inputIndex = -1;
   1714     OMX_S16 outputIndex = -1;
   1715     OMX_COMPONENTTYPE *pHandle = NULL;
   1716 
   1717     pComponentPrivate = (G711DEC_COMPONENT_PRIVATE *)
   1718         (((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate);
   1719 
   1720     pHandle = (OMX_COMPONENTTYPE *) pComponentPrivate->pHandle;
   1721     for (i=0; i < MAX_NUM_OF_BUFS; i++) {
   1722         buff = pComponentPrivate->pInputBufferList->pBufHdr[i];
   1723         if (buff == pBuffer) {
   1724             G711DEC_DPRINT("Found matching input buffer\n");
   1725             G711DEC_DPRINT("buff = %p\n",buff);
   1726             G711DEC_DPRINT("pBuffer = %p\n",pBuffer);
   1727             inputIndex = i;
   1728             break;
   1729         }
   1730         else {
   1731             G711DEC_DPRINT("This is not a match\n");
   1732             G711DEC_DPRINT("buff = %p\n",buff);
   1733             G711DEC_DPRINT("pBuffer = %p\n",pBuffer);
   1734         }
   1735     }
   1736 
   1737     for (i=0; i < MAX_NUM_OF_BUFS; i++) {
   1738         buff = pComponentPrivate->pOutputBufferList->pBufHdr[i];
   1739         if (buff == pBuffer) {
   1740             G711DEC_DPRINT("Found matching output buffer\n");
   1741             G711DEC_DPRINT("buff = %p\n",buff);
   1742             G711DEC_DPRINT("pBuffer = %p\n",pBuffer);
   1743             outputIndex = i;
   1744             break;
   1745         }
   1746         else {
   1747             G711DEC_DPRINT("This is not a match\n");
   1748             G711DEC_DPRINT("buff = %p\n",buff);
   1749             G711DEC_DPRINT("pBuffer = %p\n",pBuffer);
   1750         }
   1751     }
   1752 
   1753 
   1754     if (inputIndex != -1) {
   1755         if (pComponentPrivate->pInputBufferList->bufferOwner[inputIndex] == 1) {
   1756             tempBuff = pComponentPrivate->pInputBufferList->pBufHdr[inputIndex]->pBuffer;
   1757             tempBuff -= CACHE_ALIGNMENT;
   1758             OMX_G711DECMEMFREE_STRUCT(tempBuff);
   1759         }
   1760         OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pInputBufferList->pBufHdr[inputIndex]);
   1761         pComponentPrivate->pInputBufferList->numBuffers--;
   1762         G711DEC_DPRINT("INPUT :: numBuffers %d, nBufferCountActual %d\n",
   1763                        (int)pComponentPrivate->pInputBufferList->numBuffers,
   1764                        (int)pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->nBufferCountActual);
   1765         if (pComponentPrivate->pInputBufferList->numBuffers <
   1766             pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->nBufferCountActual) {
   1767             G711DEC_DPRINT("setting input port populated to OMX_FALSE\n");
   1768             pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->bPopulated = OMX_FALSE;
   1769         }
   1770         if(pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->bEnabled &&
   1771            pComponentPrivate->bLoadedCommandPending == OMX_FALSE &&
   1772            (pComponentPrivate->curState == OMX_StateIdle ||
   1773             pComponentPrivate->curState == OMX_StateExecuting ||
   1774             pComponentPrivate->curState == OMX_StatePause))
   1775         {
   1776             pComponentPrivate->cbInfo.EventHandler(pHandle,
   1777                                                    pHandle->pApplicationPrivate,
   1778                                                    OMX_EventError,
   1779                                                    OMX_ErrorPortUnpopulated,
   1780                                                    nPortIndex, NULL);
   1781         }
   1782     }
   1783     else if (outputIndex != -1) {
   1784         if (pComponentPrivate->pOutputBufferList->bufferOwner[outputIndex] == 1) {
   1785             tempBuff = pComponentPrivate->pOutputBufferList->pBufHdr[outputIndex]->pBuffer;
   1786             tempBuff -= CACHE_ALIGNMENT;
   1787             OMX_G711DECMEMFREE_STRUCT(tempBuff);
   1788         }
   1789 
   1790         OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pOutputBufferList->pBufHdr[outputIndex]);
   1791         pComponentPrivate->pOutputBufferList->numBuffers--;
   1792         G711DEC_DPRINT("OUTPUT :: numBuffers %d, nBufferCountActual %d\n",
   1793                        (int)pComponentPrivate->pInputBufferList->numBuffers,
   1794                        (int)pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->nBufferCountActual);
   1795 
   1796         if (pComponentPrivate->pOutputBufferList->numBuffers <
   1797             pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->nBufferCountActual) {
   1798             G711DEC_DPRINT("setting output port populated to OMX_FALSE\n");
   1799             pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bPopulated = OMX_FALSE;
   1800         }
   1801 
   1802         if(pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bEnabled &&
   1803            pComponentPrivate->bLoadedCommandPending == OMX_FALSE &&
   1804            (pComponentPrivate->curState == OMX_StateIdle ||
   1805             pComponentPrivate->curState == OMX_StateExecuting ||
   1806             pComponentPrivate->curState == OMX_StatePause))
   1807         {
   1808             pComponentPrivate->cbInfo.EventHandler(
   1809                                                    pHandle, pHandle->pApplicationPrivate,
   1810                                                    OMX_EventError, OMX_ErrorPortUnpopulated,nPortIndex, NULL);
   1811         }
   1812     }
   1813     else {
   1814         G711DEC_DPRINT("%d::Returning OMX_ErrorBadParameter\n",__LINE__);
   1815         eError = OMX_ErrorBadParameter;
   1816     }
   1817 
   1818     if ((!pComponentPrivate->pInputBufferList->numBuffers &&
   1819          !pComponentPrivate->pOutputBufferList->numBuffers) &&
   1820         pComponentPrivate->InIdle_goingtoloaded)
   1821     {
   1822         pComponentPrivate->InIdle_goingtoloaded = 0;
   1823 #ifndef UNDER_CE
   1824         pthread_mutex_lock(&pComponentPrivate->InIdle_mutex);
   1825         pthread_cond_signal(&pComponentPrivate->InIdle_threshold);
   1826         pthread_mutex_unlock(&pComponentPrivate->InIdle_mutex);
   1827 #else
   1828         OMX_SignalEvent(&(pComponentPrivate->InIdle_event));
   1829 #endif
   1830     }
   1831     /* Removing sleep() calls.  There are no allocated buffers. */
   1832 
   1833     G711DEC_DPRINT("pComponentPrivate->bDisableCommandPending = %d\n",(int)pComponentPrivate->bDisableCommandPending);
   1834     if (pComponentPrivate->bDisableCommandPending) {
   1835         if (pComponentPrivate->pInputBufferList->numBuffers + pComponentPrivate->pOutputBufferList->numBuffers == 0) {
   1836             SendCommand (pComponentPrivate->pHandle,OMX_CommandPortDisable,pComponentPrivate->bDisableCommandParam,NULL);
   1837         }
   1838     }
   1839     G711DEC_DPRINT ("%d :: Exiting FreeBuffer\n", __LINE__);
   1840     return eError;
   1841 }
   1842 
   1843 /*-------------------------------------------------------------------*/
   1844 /**
   1845  *  UseBuffer()
   1846 
   1847  * @param pComp         handle for this instance of the component
   1848  * @param pCallBacks    application callbacks
   1849  * @param ptr
   1850  *
   1851  * @retval OMX_NoError              Success, ready to roll
   1852  *         OMX_Error_BadParameter   The input parameter pointer is null
   1853  **/
   1854 /*-------------------------------------------------------------------*/
   1855 static OMX_ERRORTYPE UseBuffer (OMX_IN OMX_HANDLETYPE hComponent,
   1856                                 OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
   1857                                 OMX_IN OMX_U32 nPortIndex,
   1858                                 OMX_IN OMX_PTR pAppPrivate,
   1859                                 OMX_IN OMX_U32 nSizeBytes,
   1860                                 OMX_IN OMX_U8* pBuffer)
   1861 {
   1862     OMX_PARAM_PORTDEFINITIONTYPE *pPortDef = NULL;
   1863     G711DEC_COMPONENT_PRIVATE *pComponentPrivate = NULL;
   1864     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1865     OMX_BUFFERHEADERTYPE *pBufferHeader = NULL;
   1866 
   1867     pComponentPrivate = (G711DEC_COMPONENT_PRIVATE *)
   1868         (((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate);
   1869 
   1870     pPortDef = ((G711DEC_COMPONENT_PRIVATE*)
   1871                 pComponentPrivate)->pPortDef[nPortIndex];
   1872 
   1873     G711DEC_DPRINT("pPortDef->bPopulated = %d\n",pPortDef->bPopulated);
   1874 
   1875     if(!pPortDef->bEnabled) {
   1876         G711DEC_DPRINT ("%d :: In AllocateBuffer\n", __LINE__);
   1877         eError = OMX_ErrorIncorrectStateOperation;
   1878         goto EXIT;
   1879     }
   1880 
   1881     if(nSizeBytes != pPortDef->nBufferSize || pPortDef->bPopulated) {
   1882         G711DEC_DPRINT ("%d :: In AllocateBuffer\n", __LINE__);
   1883         eError = OMX_ErrorBadParameter;
   1884         goto EXIT;
   1885     }
   1886 
   1887     G711D_OMX_MALLOC(pBufferHeader, OMX_BUFFERHEADERTYPE);
   1888 
   1889     if (nPortIndex == G711DEC_OUTPUT_PORT) {
   1890         pBufferHeader->nInputPortIndex = -1;
   1891         pBufferHeader->nOutputPortIndex = nPortIndex;
   1892         pComponentPrivate->pOutputBufferList->pBufHdr[pComponentPrivate->pOutputBufferList->numBuffers] = pBufferHeader;
   1893         pComponentPrivate->pOutputBufferList->bBufferPending[pComponentPrivate->pOutputBufferList->numBuffers] = 0;
   1894         pComponentPrivate->pOutputBufferList->bufferOwner[pComponentPrivate->pOutputBufferList->numBuffers++] = 0;
   1895         if (pComponentPrivate->pOutputBufferList->numBuffers == pPortDef->nBufferCountActual) {
   1896             pPortDef->bPopulated = OMX_TRUE;
   1897         }
   1898     }
   1899     else {
   1900         pBufferHeader->nInputPortIndex = nPortIndex;
   1901         pBufferHeader->nOutputPortIndex = -1;
   1902         pComponentPrivate->pInputBufferList->pBufHdr[pComponentPrivate->pInputBufferList->numBuffers] = pBufferHeader;
   1903         pComponentPrivate->pInputBufferList->bBufferPending[pComponentPrivate->pInputBufferList->numBuffers] = 0;
   1904         pComponentPrivate->pInputBufferList->bufferOwner[pComponentPrivate->pInputBufferList->numBuffers++] = 0;
   1905 
   1906         if (pComponentPrivate->pInputBufferList->numBuffers == pPortDef->nBufferCountActual) {
   1907             pPortDef->bPopulated = OMX_TRUE;
   1908         }
   1909     }
   1910 
   1911     if((pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bPopulated == pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bEnabled)&&
   1912        (pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->bPopulated == pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->bEnabled) &&
   1913        (pComponentPrivate->InLoaded_readytoidle))
   1914     {
   1915         pComponentPrivate->InLoaded_readytoidle = 0;
   1916 #ifndef UNDER_CE
   1917         pthread_mutex_lock(&pComponentPrivate->InLoaded_mutex);
   1918         pthread_cond_signal(&pComponentPrivate->InLoaded_threshold);
   1919         pthread_mutex_unlock(&pComponentPrivate->InLoaded_mutex);
   1920 #else
   1921         OMX_SignalEvent(&(pComponentPrivate->InLoaded_event));
   1922 #endif
   1923     }
   1924 
   1925     pBufferHeader->pAppPrivate              =   pAppPrivate;
   1926     pBufferHeader->pPlatformPrivate         =   pComponentPrivate;
   1927     pBufferHeader->nAllocLen                =   nSizeBytes;
   1928     pBufferHeader->nVersion.s.nVersionMajor =   G711DEC_MAJOR_VER;
   1929     pBufferHeader->nVersion.s.nVersionMinor =   G711DEC_MINOR_VER;
   1930     pComponentPrivate->nVersion             =   pBufferHeader->nVersion.nVersion;
   1931     pBufferHeader->pBuffer                  =   pBuffer;
   1932     pBufferHeader->nSize                    =   sizeof(OMX_BUFFERHEADERTYPE);
   1933     *ppBufferHdr                            =   pBufferHeader;
   1934 
   1935     G711DEC_DPRINT("pBufferHeader = %p\n",pBufferHeader);
   1936 
   1937     if (pComponentPrivate->bEnableCommandPending && pPortDef->bPopulated)
   1938     {
   1939         SendCommand(pComponentPrivate->pHandle, OMX_CommandPortEnable,
   1940                     pComponentPrivate->bEnableCommandParam, NULL);
   1941     }
   1942 
   1943  EXIT:
   1944     return eError;
   1945 }
   1946 
   1947 /* ================================================================================= */
   1948 /**
   1949  * @fn GetExtensionIndex() description for GetExtensionIndex
   1950  GetExtensionIndex().
   1951  Returns index for vendor specific settings.
   1952  *
   1953  *  @see         OMX_Core.h
   1954  */
   1955 /* ================================================================================ */
   1956 static OMX_ERRORTYPE GetExtensionIndex( OMX_IN  OMX_HANDLETYPE hComponent,
   1957                                         OMX_IN  OMX_STRING cParameterName,
   1958                                         OMX_OUT OMX_INDEXTYPE *pIndexType)
   1959 {
   1960     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1961 
   1962     if(!(strcmp(cParameterName,"OMX.TI.index.config.g711headerinfo"))) {
   1963         *pIndexType = OMX_IndexCustomG711DecHeaderInfoConfig;
   1964     }
   1965     else if(!(strcmp(cParameterName,"OMX.TI.index.config.g711dec.datapath")))
   1966     {
   1967         *pIndexType = OMX_IndexCustomG711DecDataPath;
   1968     }
   1969     else if(!strcmp(cParameterName,"OMX.TI.index.config.g711dec.frameparams"))
   1970     {
   1971         *pIndexType = OMX_IndexCustomG711DecFrameParams;
   1972     }
   1973 
   1974     else
   1975     {
   1976         eError = OMX_ErrorBadParameter;
   1977     }
   1978     return eError;
   1979 }
   1980 
   1981 /* ================================================================================= */
   1982 /**
   1983  * @fn ComponentRoleEnum() description for ComponentRoleEnum()
   1984 
   1985  Returns the role at the given index
   1986  *
   1987  *  @see         OMX_Core.h
   1988  */
   1989 /* ================================================================================ */
   1990 static OMX_ERRORTYPE ComponentRoleEnum( OMX_IN OMX_HANDLETYPE hComponent,
   1991                                         OMX_OUT OMX_U8 *cRole,
   1992                                         OMX_IN OMX_U32 nIndex)
   1993 {
   1994     /*G711DEC_COMPONENT_PRIVATE *pComponentPrivate;*/
   1995     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1996     /* This is a non standard component and does not support roles */
   1997     eError = OMX_ErrorNotImplemented;
   1998 
   1999     return eError;
   2000 }
   2001 
   2002 #ifdef G711DEC_MEMDEBUG
   2003 void * mymalloc(int line, char *s, int size)
   2004 {
   2005     void *p;
   2006     int e=0;
   2007     p = malloc(size);
   2008 
   2009     if(p==NULL){
   2010         G711DEC_PRINT("Memory not available\n");
   2011         exit(1);
   2012     }
   2013     else{
   2014         while((lines[e]!=0)&& (e<500) ){
   2015             e++;
   2016         }
   2017         arr[e]=p;
   2018         lines[e]=line;
   2019         bytes[e]=size;
   2020         strcpy(file[e],s);
   2021         G711DEC_PRINT("Allocating %d bytes on address %p, line %d file %s pos %d\n", size, p, line, s, e);
   2022         return p;
   2023     }
   2024 }
   2025 
   2026 void myfree(void *dp, int line, char *s){
   2027     int q = 0;
   2028     for(q=0;q<500;q++){
   2029         if(arr[q]==dp){
   2030             G711DEC_PRINT("Deleting %d bytes on address %p, line %d file %s\n", bytes[q],dp, line, s);
   2031             free(dp);
   2032             dp = NULL;
   2033             lines[q]=0;
   2034             strcpy(file[q],"");
   2035             break;
   2036         }
   2037     }
   2038     if(500==q)
   2039         G711DEC_PRINT("\n\nPointer not found. Line:%d    File%s!!\n\n",line, s);
   2040 }
   2041 #endif
   2042