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