OSDN Git Service

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