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