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
107static OMX_ERRORTYPE SetCallbacks (OMX_HANDLETYPE hComp,
108        OMX_CALLBACKTYPE* pCallBacks, OMX_PTR pAppData);
109static OMX_ERRORTYPE GetComponentVersion (OMX_HANDLETYPE hComp,
110                                          OMX_STRING pComponentName,
111                                          OMX_VERSIONTYPE* pComponentVersion,
112                                          OMX_VERSIONTYPE* pSpecVersion,
113                                          OMX_UUIDTYPE* pComponentUUID);
114
115static OMX_ERRORTYPE SendCommand (OMX_HANDLETYPE hComp, OMX_COMMANDTYPE nCommand,
116                                  OMX_U32 nParam, OMX_PTR pCmdData);
117
118static OMX_ERRORTYPE GetParameter(OMX_HANDLETYPE hComp, OMX_INDEXTYPE nParamIndex,
119                                  OMX_PTR ComponentParamStruct);
120static OMX_ERRORTYPE SetParameter (OMX_HANDLETYPE hComp,
121                                   OMX_INDEXTYPE nParamIndex,
122                                   OMX_PTR ComponentParamStruct);
123static OMX_ERRORTYPE GetConfig (OMX_HANDLETYPE hComp,
124                                OMX_INDEXTYPE nConfigIndex,
125                                OMX_PTR pComponentConfigStructure);
126static OMX_ERRORTYPE SetConfig (OMX_HANDLETYPE hComp,
127                                OMX_INDEXTYPE nConfigIndex,
128                                OMX_PTR pComponentConfigStructure);
129
130static OMX_ERRORTYPE EmptyThisBuffer (OMX_HANDLETYPE hComp, OMX_BUFFERHEADERTYPE* pBuffer);
131
132static OMX_ERRORTYPE FillThisBuffer (OMX_HANDLETYPE hComp, OMX_BUFFERHEADERTYPE* pBuffer);
133static OMX_ERRORTYPE GetState (OMX_HANDLETYPE hComp, OMX_STATETYPE* pState);
134static OMX_ERRORTYPE ComponentTunnelRequest (OMX_HANDLETYPE hComp,
135                                             OMX_U32 nPort, OMX_HANDLETYPE hTunneledComp,
136                                             OMX_U32 nTunneledPort,
137                                             OMX_TUNNELSETUPTYPE* pTunnelSetup);
138
139static OMX_ERRORTYPE ComponentDeInit(OMX_HANDLETYPE pHandle);
140static 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
146static OMX_ERRORTYPE FreeBuffer(
147            OMX_IN  OMX_HANDLETYPE hComponent,
148            OMX_IN  OMX_U32 nPortIndex,
149            OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
150
151static 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
159static OMX_ERRORTYPE GetExtensionIndex(
160            OMX_IN  OMX_HANDLETYPE hComponent,
161            OMX_IN  OMX_STRING cParameterName,
162            OMX_OUT OMX_INDEXTYPE *pIndexType);
163
164static 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
183AM_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/*-------------------------------------------------------------------*/
198OMX_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
486error = 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
513EXIT:
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
539static 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
566EXIT:
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
587static 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
617static 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
769EXIT:
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
786static 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    }
966EXIT:
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
984static 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    }
1154EXIT:
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
1170static 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
1205EXIT:
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
1222static OMX_ERRORTYPE SetConfig (OMX_HANDLETYPE hComp,
1223                                OMX_INDEXTYPE nConfigIndex,
1224                                OMX_PTR ComponentConfigStructure)
1225{
1226OMX_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    }
1421EXIT:
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
1439static 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
1459EXIT:
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
1477static 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
1563EXIT:
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
1580static 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
1670EXIT:
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
1684static 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
1762static 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
1786static 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
1898EXIT:
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
1921static 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
2045pComponentPrivate->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) {*/
2050if (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
2072static 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
2169EXIT:
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
2181GetExtensionIndex().
2182Returns index for vendor specific settings.
2183*
2184*  @see         OMX_Core.h
2185*/
2186/* ================================================================================ */
2187static 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
2225Returns the role at the given index
2226*
2227*  @see         OMX_Core.h
2228*/
2229/* ================================================================================ */
2230static 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
2255void * 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
2277int 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
2293