OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / hardware / ti / omap3 / omx / audio / src / openmax_il / g729_dec / tests / G729DecTest.c
1
2 /*
3  *  Copyright 2001-2008 Texas Instruments - http://www.ti.com/
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 /* ================================================================================
18  *             Texas Instruments OMAP(TM) Platform Software
19  *  (c) Copyright Texas Instruments, Incorporated.  All Rights Reserved.
20  *
21  *  Use of this software is controlled by the terms and conditions found 
22  *  in the license agreement under which this software has been supplied.
23  * ================================================================================ */
24 /**
25  * @file G729DecTest.c
26  *
27  * This File contains the G729 DECODER OMX tests
28  *
29  * @path  $(OMAPSW_MPU)\linux\audio\src\openmax_il\g729_dec\tests
30  *
31  * @rev  0.5
32  */
33 /* ----------------------------------------------------------------------------- 
34  *! 
35  *! Revision History 
36  *! ===================================
37  *! Date         Author(s)            Version  Description
38  *! ---------    -------------------  -------  ---------------------------------
39  *! 03-Jan-2007  A.Donjon                         0.1      Code update for G729 DECODER
40  *! 19-Feb-2007  A.Donjon                         0.2      Update for SN change for last frame
41  *! 06-Apr-2007  A.Donjon                         0.3      USE_BUFFER
42  *! 08-Jun-2007  A.Donjon                         0.4      Variable input buffer size
43  *! 04-Jul-2007  A.Donjon                         0.5      Improved test app.                            
44  *! 
45  *!
46  * ================================================================================= */
47 /****************************************************************
48  *  INCLUDE FILES                                                 
49  ****************************************************************/
50
51 /* ----- system and platform files ----------------------------*/
52 #include <unistd.h>
53 #include <stdlib.h>
54 #include <sys/ioctl.h>
55 #include <sys/select.h>
56 #include <string.h>
57 #include <stdio.h>
58 #include <fcntl.h>
59 #include <errno.h>
60 #include <linux/vt.h>
61 #include <signal.h>
62 #include <sys/stat.h>
63 #include <pthread.h>
64 #include <linux/soundcard.h>
65 #include <time.h>
66
67 /*-------program files ----------------------------------------*/
68 #include <OMX_Index.h>
69 #include <OMX_Types.h>
70 #include <TIDspOmx.h>
71 #include <OMX_Core.h>
72 #include <OMX_Audio.h>
73 #include <G729DecTest.h>
74 #include <OMX_G729Decoder.h>
75
76 #ifdef OMX_GETTIME
77 #include <OMX_Common_Utils.h>
78 #include <OMX_GetTime.h>     /*Headers for Performance & measuremet    */
79 #endif
80
81 /* ------compilation control switches -------------------------*/
82 #undef APP_DEBUG
83 #undef APP_MEMCHECK
84 #undef APP_INFO
85 #undef USE_BUFFER
86
87 /* ======================================================================= */
88 /**
89  * @def  DASF                           Define a Value for DASF mode 
90  */
91 /* ======================================================================= */
92 #define DASF 1
93 /* ======================================================================= */
94 /**
95  * @def  GAIN                      Define a GAIN value for Configure Audio
96  */
97 /* ======================================================================= */
98 #define GAIN 95
99 /* ======================================================================= */
100 /**
101  * @def    G729DEC_SAMPLING_FREQUENCY          Sampling Frequency   
102  */
103 /* ======================================================================= */
104 #define G729DEC_SAMPLING_FREQUENCY 8000
105 /* ======================================================================= */
106 /**
107  * @def    EXTRA_BUFFBYTES                Num of Extra Bytes to be allocated
108  */
109 /* ======================================================================= */
110 #define EXTRA_BUFFBYTES (256)
111
112 /* ======================================================================= */
113 /**
114  * @def  CACHE_ALIGNMENT                           Buffer Cache Alignment
115  */
116 /* ======================================================================= */
117 #define CACHE_ALIGNMENT 128
118
119
120
121
122 #define FIFO1 "/dev/fifo.1"
123 #define FIFO2 "/dev/fifo.2"
124
125 /****************************************************************
126  * EXTERNAL REFERENCES NOTE : only use if not found in header file
127  ****************************************************************/
128 /*--------data declarations -----------------------------------*/
129 /*--------function prototypes ---------------------------------*/
130
131 /****************************************************************
132  * PUBLIC DECLARATIONS Defined here, used elsewhere
133  ****************************************************************/
134 /*--------data declarations -----------------------------------*/
135
136 /*--------function prototypes ---------------------------------*/
137
138 /****************************************************************
139  * PRIVATE DECLARATIONS Defined here, used only here
140  ****************************************************************/
141 /*--------data declarations -----------------------------------*/
142
143 #ifdef OMX_GETTIME
144 OMX_ERRORTYPE eError = OMX_ErrorNone;
145 int GT_FlagE = 0;  /* Fill Buffer 1 = First Buffer,  0 = Not First Buffer  */
146 int GT_FlagF = 0;  /*Empty Buffer  1 = First Buffer,  0 = Not First Buffer  */
147 static OMX_NODE* pListHead = NULL;
148 #endif
149
150
151 OMX_S16 inputPortDisabled = 0;
152 OMX_S16 outputPortDisabled = 0;
153 OMX_S8 InputCallbacksPending = 0;
154 OMX_S8 OutputLastPending = 0;
155
156 typedef enum COMPONENTS {
157     COMP_1,
158     COMP_2
159 }COMPONENTS;
160
161 OMX_STRING strG729Decoder = "OMX.TI.G729.decode";
162 int IpBuf_Pipe[2] = {0};
163 int OpBuf_Pipe[2] = {0};
164 fd_set rfds;
165 OMX_S16 dasfMode = 0;
166 OMX_S16 packetsPerBuffer = 0;
167 OMX_S16 EOFevent = 0;
168 OMX_BOOL bExitOnError = OMX_FALSE;
169 int command = 0;
170
171 #ifdef DSP_RENDERING_ON
172 AM_COMMANDDATATYPE cmd_data;
173 #endif
174
175 /*--------function prototypes ---------------------------------*/
176 OMX_S16 maxint(OMX_S16 a, OMX_S16 b);
177 OMX_ERRORTYPE StopComponent(OMX_HANDLETYPE *pHandle);
178 OMX_ERRORTYPE PauseComponent(OMX_HANDLETYPE *pHandle);
179 OMX_ERRORTYPE PlayComponent(OMX_HANDLETYPE *pHandle);
180 OMX_S16 fill_data_fromFile (OMX_BUFFERHEADERTYPE *pBuf, FILE *fIn, OMX_HANDLETYPE  pHandle);
181 void ConfigureAudio();
182 OMX_ERRORTYPE send_input_buffer (OMX_HANDLETYPE pHandle, OMX_BUFFERHEADERTYPE* pBuffer, FILE *fIn);
183
184 #ifdef USE_BUFFER
185 OMX_ERRORTYPE FreeResources(OMX_AUDIO_PARAM_G729TYPE* pG729Param, 
186                             OMX_AUDIO_PARAM_PCMMODETYPE* pPcmParam,
187                             OMX_PARAM_PORTDEFINITIONTYPE* pCompPrivateStruct, 
188                             OMX_AUDIO_CONFIG_MUTETYPE* pCompPrivateStructMute, 
189                             OMX_AUDIO_CONFIG_VOLUMETYPE* pCompPrivateStructVolume,
190                             TI_OMX_DSP_DEFINITION* audioinfo, 
191                             OMX_U8* pInputBuffer[10],
192                             OMX_U8* pOutputBuffer[10],
193                             G729DEC_BufParamStruct* pInBufferParam[10],
194                             OMX_HANDLETYPE* pHandle);
195 #else
196 OMX_ERRORTYPE FreeResources(OMX_AUDIO_PARAM_G729TYPE* pG729Param, 
197                             OMX_AUDIO_PARAM_PCMMODETYPE* pPcmParam,
198                             OMX_PARAM_PORTDEFINITIONTYPE* pCompPrivateStruct, 
199                             OMX_AUDIO_CONFIG_MUTETYPE* pCompPrivateStructMute, 
200                             OMX_AUDIO_CONFIG_VOLUMETYPE* pCompPrivateStructVolume,
201                             TI_OMX_DSP_DEFINITION* audioinfo, 
202                             OMX_BUFFERHEADERTYPE* pInputBufferHeader[10],
203                             OMX_BUFFERHEADERTYPE* pOutputBufferHeader[10],
204                             G729DEC_BufParamStruct* pInBufferParam[10],
205                             OMX_HANDLETYPE* pHandle);
206 #endif                                      
207
208
209 /*--------macros ----------------------------------------------*/
210 #ifdef APP_DEBUG
211 #define APP_DPRINT(...)    fprintf(stderr,__VA_ARGS__)
212 #else
213 #define APP_DPRINT(...)
214 #endif
215
216 #ifdef APP_INFO
217 #define DPRINT(...)    fprintf(stderr,__VA_ARGS__)
218 #else
219 #define DPRINT(...)
220 #endif
221
222 #ifdef APP_MEMCHECK
223 #define APP_MEMPRINT(...)    fprintf(stderr,__VA_ARGS__)
224 #else
225 #define APP_MEMPRINT(...)
226 #endif
227
228
229 /* safe routine to get the maximum of 2 integers */
230 OMX_S16 maxint(OMX_S16 a, OMX_S16 b)
231 {
232     return (a>b) ? a : b;
233 }
234
235 #define OMX_G729APP_INIT_STRUCT(_s_, _name_)    \
236     memset((_s_), 0x0, sizeof(_name_)); \
237
238 #define OMX_G729APP_MALLOC_STRUCT(_pStruct_, _sName_)                   \
239     _pStruct_ = (_sName_*)malloc(sizeof(_sName_));                      \
240     if(_pStruct_ == NULL){                                              \
241         printf("***********************************\n");                \
242         printf("%d :: Malloc Failed\n",__LINE__);                       \
243         printf("***********************************\n");                \
244         error = OMX_ErrorInsufficientResources;                         \
245         goto EXIT;                                                      \
246     }                                                                   \
247     APP_MEMPRINT("%d :: ALLOCATING MEMORY = %p\n",__LINE__,_pStruct_);
248
249 /* This method will wait for the component to get to the state
250  * specified by the DesiredState input. */
251 static OMX_ERRORTYPE WaitForState(OMX_HANDLETYPE* pHandle,
252                                   OMX_STATETYPE DesiredState)
253 {
254     OMX_STATETYPE CurState = OMX_StateInvalid;
255     OMX_ERRORTYPE eError = OMX_ErrorNone;
256     OMX_S16 nCnt = 0;
257     OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)pHandle;
258     eError = pComponent->GetState(pHandle, &CurState);
259
260     while((eError == OMX_ErrorNone) && (CurState != DesiredState) && (eError == OMX_ErrorNone) ) {
261         sleep(1);
262         if(nCnt++ == 10) {
263             APP_DPRINT( "Still Waiting, press CTL-C to continue\n");
264         }
265         eError = pComponent->GetState(pHandle, &CurState);
266
267     }
268     return eError;
269 }
270
271
272 OMX_ERRORTYPE EventHandler(
273                            OMX_HANDLETYPE hComponent,
274                            OMX_PTR pAppData,
275                            OMX_EVENTTYPE eEvent,
276                            OMX_U32 nData1,
277                            OMX_U32 nData2,
278                            OMX_PTR pEventData)
279 {
280
281     OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)hComponent;
282     OMX_STATETYPE state = OMX_StateInvalid;
283     OMX_ERRORTYPE eError = OMX_ErrorNone;
284         
285 #ifdef APP_DEBUG
286     int iComp = *((int *)(pAppData));
287 #endif
288
289     eError = pComponent->GetState (hComponent, &state);
290     if(eError != OMX_ErrorNone) {
291         APP_DPRINT("%d :: App: Error returned from GetState\n",__LINE__);
292     }
293     switch (eEvent) {
294     case OMX_EventCmdComplete:
295
296         if(nData1 == OMX_CommandPortDisable){
297             if (nData2 == OMX_DirInput) {
298                 inputPortDisabled = 1;
299             }
300             if (nData2 == OMX_DirOutput) {
301                 outputPortDisabled = 1;
302             }
303         }
304         else if(nData1 == OMX_CommandStateSet){
305
306
307         }
308         break;
309
310     case OMX_EventError:
311         /* Error notification */
312         if(nData1==OMX_ErrorOverflow){
313             APP_DPRINT("EventHandler: WARNING: Overflow ERROR\n");
314             /* Output buffer with sufficient allocated size must be sent to SN */
315         }
316         if(nData1==OMX_ErrorStreamCorrupt){
317             APP_DPRINT("EventHandler: ERROR: Data corrupt ERROR\n");
318             /* Corrupted input buffer parameters, component must be reseted or stopped */
319         }
320         break;
321         break;
322     case OMX_EventMax:
323         break;
324     case OMX_EventMark:
325         break;
326
327     default:
328         break;
329     }
330     return eError;
331 }
332
333 void FillBufferDone (OMX_HANDLETYPE hComponent, OMX_PTR ptr, OMX_BUFFERHEADERTYPE* pBufferO)
334 {
335     APP_DPRINT ("APP:::: OUTPUT BUFFER = %p && %p\n",pBufferO, pBufferO->pBuffer);
336     APP_DPRINT ("APP:::: pBuffer->nFilledLen = %d\n",pBufferO->nFilledLen);
337     write(OpBuf_Pipe[1], &pBufferO, sizeof(pBufferO));
338     
339 #ifdef OMX_GETTIME
340     if (GT_FlagF == 1 ) /* First Buffer Reply*/  /* 1 = First Buffer,  0 = Not First Buffer  */
341     { 
342         GT_END("Call to FillBufferDone  <First: FillBufferDone>");
343         GT_FlagF = 0 ;   /* 1 = First Buffer,  0 = Not First Buffer  */
344     }
345 #endif
346
347 }
348
349
350 void EmptyBufferDone(OMX_HANDLETYPE hComponent, OMX_PTR ptr, OMX_BUFFERHEADERTYPE* pBufferI)
351 {
352     OMX_S16 ret = 0;
353     APP_DPRINT ("APP:::: INPUT BUFFER = %p && %p\n",pBufferI, pBufferI->pBuffer);
354     if (command == 0){
355         APP_DPRINT("output: pBuffer->nTimeStamp = %d\n", (int)pBufferI->nTimeStamp);
356         APP_DPRINT("output: pBuffer->nTickCount = %ld\n", pBufferI->nTickCount);
357     }
358     ret = write(IpBuf_Pipe[1], &pBufferI, sizeof(pBufferI));
359     
360 #ifdef OMX_GETTIME
361     if (GT_FlagE == 1 ) /* First Buffer Reply*/  /* 1 = First Buffer,  0 = Not First Buffer  */
362     {
363         GT_END("Call to EmptyBufferDone <First: EmptyBufferDone>");
364         GT_FlagE = 0;   /* 1 = First Buffer,  0 = Not First Buffer  */
365     }
366 #endif
367 }
368
369
370
371 OMX_S16 SendInputBuffer = 0;
372 OMX_S16 numInputBuffers = 0;
373 OMX_S16 numOutputBuffers = 0;
374 FILE *fp;
375
376 int main(int argc, char* argv[])
377 {
378     OMX_CALLBACKTYPE G729CaBa = {(void *)EventHandler,
379                                  (void*)EmptyBufferDone,
380                                  (void*)FillBufferDone};                               
381     OMX_HANDLETYPE pHandle;
382     OMX_ERRORTYPE error = OMX_ErrorNone;
383     OMX_U32 AppData = 100;
384     OMX_PARAM_PORTDEFINITIONTYPE* pCompPrivateStruct = NULL; 
385     OMX_AUDIO_PARAM_G729TYPE *pG729Param = NULL;
386     OMX_AUDIO_PARAM_PCMMODETYPE *pPcmParam = NULL;
387     OMX_COMPONENTTYPE *pComponent = NULL; 
388     OMX_STATETYPE state = OMX_StateInvalid;
389     OMX_BUFFERHEADERTYPE* pInputBufferHeader[10] = {NULL};
390     OMX_BUFFERHEADERTYPE* pOutputBufferHeader[10] = {NULL};
391     TI_OMX_DSP_DEFINITION *audioinfo = NULL;
392     G729DEC_BufParamStruct* pInBufferParam[10] = {NULL};
393
394 #ifdef USE_BUFFER
395     OMX_U8* pInputBuffer[10] = {NULL};
396     OMX_U8* pOutputBuffer[10]= {NULL};
397 #endif
398     
399     struct timeval tv;
400     OMX_S16 retval = 0, i = 0, j = 0,k = 0;
401     OMX_S16 frmCount = 0;
402     OMX_S16 OutBufCount = 0;
403     OMX_S16 InBufCount = 0;
404     OMX_S16 testcnt = 1;
405     OMX_S16 testcnt1 = 1;
406     OMX_BUFFERHEADERTYPE* pBuffer = NULL;
407     OMX_BUFFERHEADERTYPE* pBuf = NULL;
408     OMX_INDEXTYPE index = 0;  
409     TI_OMX_DATAPATH dataPath;
410     int g729decfdwrite = 0;
411     int g729decfdread = 0;
412     OMX_AUDIO_CONFIG_MUTETYPE* pCompPrivateStructMute = NULL; 
413     OMX_AUDIO_CONFIG_VOLUMETYPE* pCompPrivateStructVolume = NULL; 
414
415 #ifdef MTRACE
416     mtrace();
417 #endif
418
419     bExitOnError = OMX_FALSE; 
420     OMX_G729APP_MALLOC_STRUCT(audioinfo, TI_OMX_DSP_DEFINITION);
421     OMX_G729APP_INIT_STRUCT(audioinfo, TI_OMX_DSP_DEFINITION);
422     APP_DPRINT("------------------------------------------------------\n");
423     APP_DPRINT("This is Main Thread In G729 DECODER Test Application:\n");
424     APP_DPRINT("Test Core 1.5 - " __DATE__ ":" __TIME__ "\n");
425     APP_DPRINT("------------------------------------------------------\n");
426
427 #ifdef OMX_GETTIME
428     GTeError = OMX_ListCreate(&pListHead);
429     printf("eError = %d\n",GTeError);
430     GT_START();
431 #endif
432
433 #ifdef DSP_RENDERING_ON
434     if((g729decfdwrite=open(FIFO1,O_WRONLY))<0) {
435         printf("[G729TEST] - failure to open WRITE pipe\n");
436     }
437     else {
438         printf("[G729TEST] - opened WRITE pipe\n");
439     }
440
441     if((g729decfdread=open(FIFO2,O_RDONLY))<0) {
442         printf("[G729TEST] - failure to open READ pipe\n");
443         bExitOnError = OMX_TRUE;
444         goto EXIT;
445     }
446     else {
447         printf("[G729TEST] - opened READ pipe\n");
448     }
449 #endif
450
451     /* check the input parameters */
452     if(argc != 8) {
453         printf( "Usage:  testApp infile outfile TestCaseNo DASFmode nbinbuf nboutbuf nbPacketsPerBuffer\n");
454         printf("        DASFmode: FM or DM for File Mode or DASF Mode\n");
455         bExitOnError = OMX_TRUE;
456         goto EXIT;
457     }
458
459     numInputBuffers = atoi(argv[5]);
460     numOutputBuffers = atoi(argv[6]);
461
462     /* validate number of buffers input from command */
463     if(numInputBuffers < 1 || numInputBuffers > 4)
464     {
465         printf("Please use between at least 1 but no more than 4 input buffers\n");
466         bExitOnError = OMX_TRUE;
467         goto EXIT;
468     }
469     if(numOutputBuffers < 1 || numOutputBuffers > 4)
470     {
471         printf("Please use between at least 1 but no more than 4 output buffers\n");
472         bExitOnError = OMX_TRUE;
473         goto EXIT;
474     }
475     APP_DPRINT( "Nb input buffers: %d, Nb output buffers: %d\n", numInputBuffers, numOutputBuffers);
476     packetsPerBuffer = atoi(argv[7]);
477     if((packetsPerBuffer>0)&&(packetsPerBuffer<7)){
478         APP_DPRINT( "Nb packets per buffer: %d\n", packetsPerBuffer);
479     }
480     else{
481         printf("Number of packets per buffer should be between 1 and 6\n");
482         bExitOnError = OMX_TRUE;
483         goto EXIT;
484     }
485
486     /* check to see that the input file exists */
487     struct stat sb = {0};
488     OMX_S16 status = stat(argv[1], &sb);
489     if( status != 0 ) {
490         APP_DPRINT( "Cannot find file %s. (%u)\n", argv[1], errno);
491         bExitOnError = OMX_TRUE;
492         goto EXIT;
493     }
494
495     /* Open the file of data to be decoded */
496     FILE* fIn = fopen(argv[1], "r");
497     fp =fopen(argv[1], "r");
498     if( fIn == NULL ) {
499         APP_DPRINT( "Error:  failed to open the file %s for readonly\access\n", argv[1]);
500         bExitOnError = OMX_TRUE;
501         goto EXIT;
502     }
503
504     FILE* fOut = NULL;
505     /* Open the output file only in no DASF mode*/
506     if(!(strcmp(argv[4],"FM"))){ 
507         fOut = fopen(argv[2], "w");
508         APP_DPRINT( "NO DASF MODE, created output file \n");
509         if( fOut == NULL ) {
510             APP_DPRINT( "Error:  failed to create the output file %s\n", argv[2]);
511             bExitOnError = OMX_TRUE;
512             goto EXIT;
513         }
514     }
515
516     /* Create a pipe used to queue data from the callback. */
517     retval = pipe(IpBuf_Pipe);
518     if( retval != 0) {
519         APP_DPRINT( "Error:Fill Data Pipe failed to open\n");
520         bExitOnError = OMX_TRUE;
521         goto EXIT;
522     }
523
524     retval = pipe(OpBuf_Pipe);
525     if( retval != 0) {
526         APP_DPRINT( "Error:Empty Data Pipe failed to open\n");
527         bExitOnError = OMX_TRUE;
528         goto EXIT;
529     }
530
531     /* save off the "max" of the handles for the selct statement */
532     OMX_S16 fdmax = maxint(IpBuf_Pipe[0], OpBuf_Pipe[0]);
533
534     APP_DPRINT("%d :: G729Test\n",__LINE__);
535     error = TIOMX_Init();
536     APP_DPRINT("%d :: G729Test\n",__LINE__);
537     if(error != OMX_ErrorNone) {
538         APP_DPRINT("%d :: Error returned by OMX_Init()\n",__LINE__);
539         bExitOnError = OMX_TRUE;
540         goto EXIT;
541     }
542
543     /* Test case number */
544     command = atoi(argv[3]);
545     APP_DPRINT("%d :: G729Test\n",__LINE__);
546     switch (command ) {
547     case 0:
548         printf ("-------------------------------------\n");
549         printf ("Testing Time stamp and Tick count \n");
550         printf ("-------------------------------------\n");
551         break;
552     case 1:
553         printf ("-------------------------------------\n");
554         printf ("Testing Simple PLAY till EOF \n");
555         printf ("-------------------------------------\n");
556         break;
557     case 2:
558         printf ("-------------------------------------\n");
559         printf ("Testing Stop and Play \n");
560         printf ("-------------------------------------\n");
561         break;
562     case 3:
563         printf ("-------------------------------------\n");
564         printf ("Testing PAUSE & RESUME Command\n");
565         printf ("-------------------------------------\n");
566         break;
567     case 4:
568         printf ("---------------------------------------------\n");
569         printf ("Testing STOP Command by Stopping In-Between\n");
570         printf ("---------------------------------------------\n");
571         break;
572     case 5:
573         printf ("-------------------------------------------------\n");
574         printf ("Testing Repeated PLAY without Deleting Component\n");
575         printf ("-------------------------------------------------\n");
576         testcnt = 15;
577         break;
578     case 6:
579         printf ("------------------------------------------------\n");
580         printf ("Testing Repeated PLAY with Deleting Component\n");
581         printf ("------------------------------------------------\n");
582         testcnt1 = 15;
583         break;
584     case 7:
585         printf ("------------------------------------------------------------\n");
586         printf ("Testing Mute/Unmute for Playback Stream\n");
587         printf ("------------------------------------------------------------\n");
588         break;
589     case 8:
590         printf ("------------------------------------------------------------\n");
591         printf ("Testing Set Volume for Playback Stream\n");
592         printf ("------------------------------------------------------------\n");
593         break;
594     default:
595         printf("------------------------------------------------------------\n");
596         printf("Wrong test case number. Valid test number from 1 to 8\n");
597         bExitOnError = OMX_TRUE;
598         goto EXIT;
599     }
600
601     if(!(strcmp(argv[4],"FM"))) {
602         audioinfo->dasfMode = 0;
603         dasfMode = 0;
604         printf("NON DASF MODE\n");
605     } 
606     else if(!(strcmp(argv[4],"DM"))){
607         audioinfo->dasfMode = 1;
608         dasfMode = 1;
609         printf("DASF MODE\n");
610         
611 #if STATE_TRANSITION_STATE
612         ConfigureAudio();
613 #endif
614
615     } 
616     else {
617         printf("Enter proper DASF mode: \n");
618         printf("Should be one of these modes: FM or DM for File Mode or DASF Mode\n");
619         bExitOnError = OMX_TRUE;
620         goto EXIT;
621     }
622
623
624     APP_DPRINT("%d :: G729Test\n",__LINE__);
625     for(j = 0; j < testcnt1; j++) {
626         if(j >= 1) {
627             printf ("Decoding the file for %d Time\n",j+1);
628             close(IpBuf_Pipe[0]);
629             close(IpBuf_Pipe[1]);
630             close(OpBuf_Pipe[0]);
631             close(OpBuf_Pipe[1]);
632                         
633
634             /* Create a pipe used to queue data from the callback. */
635             retval = pipe( IpBuf_Pipe);
636             if( retval != 0) {
637                 APP_DPRINT( "Error:Fill Data Pipe failed to open\n");
638                 bExitOnError = OMX_TRUE;
639                 goto EXIT;
640             }
641
642             retval = pipe( OpBuf_Pipe);
643             if( retval != 0) {
644                 APP_DPRINT( "Error:Empty Data Pipe failed to open\n");
645                 bExitOnError = OMX_TRUE;
646                 goto EXIT;
647             }
648
649             /* Open the input file to be decoded */
650             fIn = fopen(argv[1], "r");
651             fp= fopen(argv[1], "r");
652             if( fIn == NULL ) {
653                 fprintf(stderr, "Error:  failed to open the file %s for readonly\
654                                                                    access\n", argv[1]);
655                 bExitOnError = OMX_TRUE;
656                 goto EXIT;
657             }
658
659             /* Open the output file only in non DASF mode */
660             if(audioinfo->dasfMode == 0){
661                 fOut = fopen(argv[2], "w");
662                 if( fOut == NULL ) {
663                     fprintf(stderr, "Error:  failed to create the output file \n");
664                     bExitOnError = OMX_TRUE;
665                     goto EXIT;
666                 }
667                 error = TIOMX_Init(); 
668             }
669
670         }
671  
672         /* Load the G729 Decoder Component */
673         APP_DPRINT("%d :: G729Test\n",__LINE__);
674         
675 #ifdef OMX_GETTIME
676         GT_START();
677         error = OMX_GetHandle(&pHandle, strG729Decoder, &AppData, &G729CaBa);
678         GT_END("Call to GetHandle");
679 #else 
680         error = TIOMX_GetHandle(&pHandle, strG729Decoder, &AppData, &G729CaBa);
681 #endif
682
683         APP_DPRINT("%d :: G729Test\n",__LINE__);
684         if((error != OMX_ErrorNone) || (pHandle == NULL)) {
685             APP_DPRINT ("Error in Get Handle function\n");
686             bExitOnError = OMX_TRUE;
687             goto EXIT;
688         }
689
690         APP_DPRINT("%d :: G729Test\n",__LINE__);
691         OMX_G729APP_MALLOC_STRUCT(pCompPrivateStruct, OMX_PARAM_PORTDEFINITIONTYPE);
692         OMX_G729APP_INIT_STRUCT(pCompPrivateStruct, OMX_PARAM_PORTDEFINITIONTYPE);
693         /* set playback stream mute/unmute */ 
694         OMX_G729APP_MALLOC_STRUCT(pCompPrivateStructMute, OMX_AUDIO_CONFIG_MUTETYPE); 
695         OMX_G729APP_INIT_STRUCT(pCompPrivateStructMute, OMX_AUDIO_CONFIG_MUTETYPE); 
696         OMX_G729APP_MALLOC_STRUCT(pCompPrivateStructVolume, OMX_AUDIO_CONFIG_VOLUMETYPE); 
697         OMX_G729APP_INIT_STRUCT(pCompPrivateStructVolume, OMX_AUDIO_CONFIG_VOLUMETYPE); 
698         
699
700
701         pCompPrivateStruct->nSize = sizeof (OMX_PARAM_PORTDEFINITIONTYPE);
702         pCompPrivateStruct->nVersion.s.nVersionMajor = 0x1; 
703         pCompPrivateStruct->nVersion.s.nVersionMinor = 0x2; 
704         APP_DPRINT("%d :: G729Test\n",__LINE__);
705
706         /* Send input port config */
707         pCompPrivateStruct->eDir = OMX_DirInput; 
708         pCompPrivateStruct->nPortIndex = OMX_DirInput; 
709         pCompPrivateStruct->nBufferCountActual = numInputBuffers; 
710         pCompPrivateStruct->nBufferSize = INPUT_G729DEC_BUFFER_SIZE*packetsPerBuffer; 
711         pCompPrivateStruct->format.audio.eEncoding = OMX_AUDIO_CodingG729; 
712         pCompPrivateStruct->bEnabled = 1;
713         pCompPrivateStruct->bPopulated = 0; 
714 #ifdef OMX_GETTIME
715         GT_START();
716         error = OMX_SetParameter (pHandle,OMX_IndexParamPortDefinition,
717                                   pCompPrivateStruct);
718         GT_END("Set Parameter Test-SetParameter");
719 #else
720         error = OMX_SetParameter (pHandle,OMX_IndexParamPortDefinition,
721                                   pCompPrivateStruct);
722 #endif
723         if (error != OMX_ErrorNone) {
724             error = OMX_ErrorBadParameter;
725             printf ("%d:: OMX_ErrorBadParameter\n",__LINE__);
726             bExitOnError = OMX_TRUE;
727             goto EXIT;
728         }
729
730         /* Send output port config */
731         pCompPrivateStruct->nPortIndex = OMX_DirOutput; 
732         pCompPrivateStruct->eDir = OMX_DirOutput; 
733         pCompPrivateStruct->format.audio.eEncoding = OMX_AUDIO_CodingPCM; 
734         pCompPrivateStruct->nBufferCountActual = numOutputBuffers; 
735         pCompPrivateStruct->nBufferSize = (OUTPUT_G729DEC_BUFFER_SIZE)*packetsPerBuffer; 
736         if(audioinfo->dasfMode == 1) {
737             pCompPrivateStruct->nBufferCountActual = 0;
738         }
739     
740 #ifdef OMX_GETTIME
741         GT_START();
742         error = OMX_SetParameter (pHandle,OMX_IndexParamPortDefinition,
743                                   pCompPrivateStruct);
744         GT_END("Set Parameter Test-SetParameter");
745 #else
746         error = OMX_SetParameter (pHandle,OMX_IndexParamPortDefinition,
747                                   pCompPrivateStruct);
748 #endif
749
750         if (error != OMX_ErrorNone) {
751             error = OMX_ErrorBadParameter;
752             printf ("%d:: OMX_ErrorBadParameter\n",__LINE__);
753             bExitOnError = OMX_TRUE;
754             goto EXIT;
755         }
756     
757         /* default setting for Mute/Unmute */ 
758         pCompPrivateStructMute->nSize = sizeof (OMX_AUDIO_CONFIG_MUTETYPE); 
759         pCompPrivateStructMute->nVersion.s.nVersionMajor    = 0x1; 
760         pCompPrivateStructMute->nVersion.s.nVersionMinor    = 0x1; 
761         pCompPrivateStructMute->nPortIndex                  = OMX_DirInput; 
762         pCompPrivateStructMute->bMute                       = OMX_FALSE; 
763    
764         /* default setting for volume */ 
765         pCompPrivateStructVolume->nSize = sizeof(OMX_AUDIO_CONFIG_VOLUMETYPE); 
766         pCompPrivateStructVolume->nVersion.s.nVersionMajor  = 0x1; 
767         pCompPrivateStructVolume->nVersion.s.nVersionMinor  = 0x1; 
768         pCompPrivateStructVolume->nPortIndex                = OMX_DirInput; 
769         pCompPrivateStructVolume->bLinear                   = OMX_FALSE; 
770         pCompPrivateStructVolume->sVolume.nValue            = 0x4000;             /*actual volume */ 
771         pCompPrivateStructVolume->sVolume.nMin              = 0;                /* min volume */ 
772         pCompPrivateStructVolume->sVolume.nMax              = 100;              /* max volume */ 
773
774 #ifndef USE_BUFFER      
775
776         for (i=0; i < numInputBuffers; i++) {
777             OMX_G729APP_MALLOC_STRUCT(pInBufferParam[i], G729DEC_BufParamStruct);
778             OMX_G729APP_INIT_STRUCT(pInBufferParam[i], G729DEC_BufParamStruct);
779             /* allocate input buffer */
780             APP_DPRINT("%d :: About to call OMX_AllocateBuffer\n",__LINE__);
781             error = OMX_AllocateBuffer(pHandle,
782                                        &pInputBufferHeader[i], 0,
783                                        pInBufferParam[i],
784                                        INPUT_G729DEC_BUFFER_SIZE*packetsPerBuffer);
785             APP_DPRINT("%d :: called OMX_AllocateBuffer\n",__LINE__);
786             if(error != OMX_ErrorNone) {
787                 APP_DPRINT("%d :: Error returned by OMX_AllocateBuffer()\n",__LINE__);
788                 bExitOnError = OMX_TRUE;
789                 goto EXIT;
790             }
791         }
792         for (i=0; i < numOutputBuffers; i++) {
793             /* allocate output buffer */
794             APP_DPRINT("%d :: About to call OMX_AllocateBuffer\n",__LINE__);
795             error = OMX_AllocateBuffer(pHandle,&pOutputBufferHeader[i],1,NULL,(OUTPUT_G729DEC_BUFFER_SIZE)*packetsPerBuffer);
796             APP_DPRINT("%d :: called OMX_AllocateBuffer\n",__LINE__);
797             if(error != OMX_ErrorNone) {
798                 APP_DPRINT("%d :: Error returned by OMX_AllocateBuffer()\n",__LINE__);
799                 bExitOnError = OMX_TRUE;
800                 goto EXIT;
801             }
802         }
803
804 #else
805
806         APP_DPRINT("%d :: About to call OMX_UseBuffer\n",__LINE__);
807         /* numInputBuffers validated above to resolve Klockworks error */
808         for (i=0; i < numInputBuffers; i++){
809             OMX_G729APP_MALLOC_STRUCT(pInBufferParam[i], G729DEC_BufParamStruct);
810             OMX_G729APP_INIT_STRUCT(pInBufferParam[i], G729DEC_BufParamStruct);
811             pInputBuffer[i] = (OMX_U8*)malloc((INPUT_G729DEC_BUFFER_SIZE*packetsPerBuffer) + EXTRA_BUFFBYTES);
812             memset(pInputBuffer[i] , 0x0, (INPUT_G729DEC_BUFFER_SIZE*packetsPerBuffer) + EXTRA_BUFFBYTES);
813             APP_MEMPRINT("%d:::[TESTAPPALLOC] %p\n",__LINE__,pInputBuffer[i]);
814             pInputBuffer[i] = pInputBuffer[i] + CACHE_ALIGNMENT;
815
816             /* allocate input buffer */
817             APP_DPRINT("%d :: About to call OMX_UseBuffer\n",__LINE__);
818             error = OMX_UseBuffer(pHandle,&pInputBufferHeader[i],0,pInBufferParam[i],INPUT_G729DEC_BUFFER_SIZE*packetsPerBuffer,pInputBuffer[i]);
819             APP_DPRINT("%d :: called OMX_UseBuffer\n",__LINE__);
820             if(error != OMX_ErrorNone){
821                 APP_DPRINT("%d :: Error returned by OMX_UseBuffer()\n",__LINE__);
822                 bExitOnError = OMX_TRUE;
823                 goto EXIT;
824             }
825         }
826         /* numInputBuffers validated above to resolve Klockworks error */
827         for ( i = 0 ; i < numOutputBuffers ; i++ ){
828             pOutputBuffer[i] = (OMX_U8*)malloc(((OUTPUT_G729DEC_BUFFER_SIZE)*packetsPerBuffer)+EXTRA_BUFFBYTES);
829             memset(pOutputBuffer[i] , 0x0, (OUTPUT_G729DEC_BUFFER_SIZE*packetsPerBuffer) + EXTRA_BUFFBYTES);
830             APP_MEMPRINT("%d:::[TESTAPPALLOC] %p\n",__LINE__,pOutputBuffer);
831             pOutputBuffer[i] = pOutputBuffer[i] + CACHE_ALIGNMENT;
832             /* allocate output buffer */
833             APP_DPRINT("%d :: About to call OMX_UseBuffer\n",__LINE__);
834             error = OMX_UseBuffer(pHandle,&pOutputBufferHeader[i],1,NULL,(OUTPUT_G729DEC_BUFFER_SIZE)*packetsPerBuffer,pOutputBuffer[i]);
835             APP_DPRINT("%d :: called OMX_UseBuffer\n",__LINE__);
836             if(error != OMX_ErrorNone){
837                 APP_DPRINT("%d :: Error returned by OMX_UseBuffer()\n",__LINE__);
838                 bExitOnError = OMX_TRUE;
839                 goto EXIT;
840             }
841         }
842 #endif
843
844         OMX_G729APP_MALLOC_STRUCT(pG729Param, OMX_AUDIO_PARAM_G729TYPE);
845         OMX_G729APP_INIT_STRUCT(pG729Param, OMX_AUDIO_PARAM_G729TYPE);
846         pG729Param->nSize = sizeof (OMX_AUDIO_PARAM_G729TYPE);
847         pG729Param->nVersion.s.nVersionMajor = 0xF1;
848         pG729Param->nVersion.s.nVersionMinor = 0xF2;
849         pG729Param->nPortIndex = OMX_DirInput;
850         pG729Param->nChannels = 1;
851         pG729Param->eBitType = OMX_AUDIO_G729AB;
852
853 #ifdef OMX_GETTIME
854         GT_START();
855         error = OMX_SetParameter (pHandle,OMX_IndexParamAudioG729,
856                                   pG729Param);
857         GT_END("Set Parameter Test-SetParameter");
858 #else
859         error = OMX_SetParameter (pHandle,OMX_IndexParamAudioG729,
860                                   pG729Param);
861 #endif
862
863         if (error != OMX_ErrorNone) {
864             error = OMX_ErrorBadParameter;
865             printf ("%d:: OMX_ErrorBadParameter\n",__LINE__);
866             bExitOnError = OMX_TRUE;
867             goto EXIT;
868         }
869         OMX_G729APP_MALLOC_STRUCT(pPcmParam, OMX_AUDIO_PARAM_PCMMODETYPE);
870         OMX_G729APP_INIT_STRUCT(pPcmParam, OMX_AUDIO_PARAM_PCMMODETYPE);
871         pPcmParam->nPortIndex = OMX_DirOutput;
872         pPcmParam->nChannels = 1;
873 #ifdef OMX_GETTIME
874         GT_START();
875         error = OMX_SetParameter (pHandle,OMX_IndexParamAudioPcm,
876                                   pPcmParam);
877         GT_END("Set Parameter Test-SetParameter");
878 #else
879         error = OMX_SetParameter (pHandle,OMX_IndexParamAudioPcm,
880                                   pPcmParam);
881 #endif
882         if (error != OMX_ErrorNone) {
883             error = OMX_ErrorBadParameter;
884             printf ("%d:: OMX_ErrorBadParameter\n",__LINE__);
885             bExitOnError = OMX_TRUE;
886             goto EXIT;
887         }
888
889         /* get TeeDN or ACDN mode */
890         audioinfo->acousticMode = OMX_FALSE;
891
892         if (dasfMode) {
893 #ifdef RTM_PATH    
894             dataPath = DATAPATH_APPLICATION_RTMIXER;
895 #endif
896
897 #ifdef ETEEDN_PATH
898             dataPath = DATAPATH_APPLICATION;
899 #endif        
900         }
901  
902         error = OMX_GetExtensionIndex(pHandle, "OMX.TI.index.config.g729headerinfo",&index);
903         if (error != OMX_ErrorNone) {
904             printf("Error getting extension index\n");
905             bExitOnError = OMX_TRUE;
906             goto EXIT;
907         }
908
909 #ifdef DSP_RENDERING_ON
910         cmd_data.hComponent = pHandle;
911         cmd_data.AM_Cmd = AM_CommandIsOutputStreamAvailable;
912         cmd_data.param1 = 0;
913         if((write(g729decfdwrite, &cmd_data, sizeof(cmd_data)))<0) {
914             printf("%d ::OMX_G729Decoder.c ::[G729 Dec Component] - send command to audio manager\n", __LINE__);
915         }
916         if((read(g729decfdread, &cmd_data, sizeof(cmd_data)))<0) {
917             printf("%d ::OMX_G729Decoder.c ::[G729 Dec Component] - failure to get data from the audio manager\n", __LINE__);
918             bExitOnError = OMX_TRUE;
919             goto EXIT;
920         }
921         audioinfo->streamId = cmd_data.streamID;
922 #endif
923
924         error = OMX_SetConfig (pHandle, index, audioinfo);
925         if(error != OMX_ErrorNone) {
926             error = OMX_ErrorBadParameter;
927             APP_DPRINT("%d :: Error from OMX_SetConfig() function\n",__LINE__);
928             bExitOnError = OMX_TRUE;
929             goto EXIT;
930             /* TODO: should be sure resources are cleaned up at any of the goto EXIT statements */
931         }
932
933         error = OMX_GetExtensionIndex(pHandle, "OMX.TI.index.config.g729.datapath",&index);
934         if (error != OMX_ErrorNone) {
935             printf("Error getting extension index\n");
936             bExitOnError = OMX_TRUE;
937             goto EXIT;
938         }
939     
940
941         error = OMX_SetConfig (pHandle, index, &dataPath);
942         if(error != OMX_ErrorNone) {
943             error = OMX_ErrorBadParameter;
944             APP_DPRINT("%d :: G729DecTest.c :: Error from OMX_SetConfig() function\n",__LINE__);
945             bExitOnError = OMX_TRUE;
946             goto EXIT;
947         }
948
949 #ifdef OMX_GETTIME
950         GT_START();
951 #endif
952
953         error = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StateIdle, NULL);
954         if(error != OMX_ErrorNone) {
955             APP_DPRINT ("Error from SendCommand-Idle(Init) State function\n");
956             bExitOnError = OMX_TRUE;
957             goto EXIT;
958         }
959         /* Wait for startup to complete */
960         error = WaitForState(pHandle, OMX_StateIdle);
961 #ifdef OMX_GETTIME
962         GT_END("Call to SendCommand <OMX_StateIdle>");
963 #endif
964         if(error != OMX_ErrorNone) {
965             APP_DPRINT( "Error:  hG729Decoder->WaitForState reports an error %X\n", error);
966             bExitOnError = OMX_TRUE;
967             goto EXIT;
968         }
969         for(i = 0; i < testcnt; i++) { /* PROCESS LOOP */
970             if(i > 0) {
971                 printf ("Decoding the file for %d Time\n",i+1);
972                 close(IpBuf_Pipe[0]);
973                 close(IpBuf_Pipe[1]);
974                 close(OpBuf_Pipe[0]);
975                 close(OpBuf_Pipe[1]);
976
977                 /* Create a pipe used to queue data from the callback. */
978                 retval = pipe(IpBuf_Pipe);
979                 if( retval != 0) {
980                     APP_DPRINT( "Error:Fill Data Pipe failed to open\n");
981                     bExitOnError = OMX_TRUE;
982                     goto EXIT;
983                 }
984
985                 retval = pipe(OpBuf_Pipe);
986                 if( retval != 0) {
987                     APP_DPRINT( "Error:Empty Data Pipe failed to open\n");
988                     bExitOnError = OMX_TRUE;
989                     goto EXIT;
990                 }
991
992                 /* Open the input file for decoding */
993                 fIn = fopen(argv[1], "r");
994                 fp= fopen(argv[1], "r");
995                 if(fIn == NULL) {
996                     fprintf(stderr, "Error:  failed to open the file %s for readonly access\n", argv[1]);
997                     bExitOnError = OMX_TRUE;
998                     goto EXIT;
999                 }
1000
1001                 /* Open the output file only in non DASF mode */
1002                 if(audioinfo->dasfMode == 0){
1003                     fOut = fopen(argv[2], "w");
1004                     if(fOut == NULL) {
1005                         fprintf(stderr, "Error:  failed to create the output file \n");
1006                         bExitOnError = OMX_TRUE;
1007                         goto EXIT;
1008                     }
1009                 }
1010             }
1011             printf ("Basic Function:: Sending OMX_StateExecuting Command\n");
1012 #ifdef OMX_GETTIME
1013             GT_START();
1014 #endif
1015             error = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StateExecuting, NULL);
1016             if(error != OMX_ErrorNone) {
1017                 APP_DPRINT ("Error from SendCommand-Executing State function\n");
1018                 bExitOnError = OMX_TRUE;
1019                 goto EXIT;
1020             }
1021             pComponent = (OMX_COMPONENTTYPE *)pHandle;
1022             error = pComponent->GetState(pHandle, &state);
1023             error = WaitForState(pHandle, OMX_StateExecuting);
1024 #ifdef OMX_GETTIME
1025             GT_END("Call to SendCommand <OMX_StateExecuting>");
1026 #endif
1027             if(error != OMX_ErrorNone) {
1028                 APP_DPRINT( "Error:  hG729Decoder->WaitForState reports an error %X\n", error);
1029                 bExitOnError = OMX_TRUE;
1030                 goto EXIT;
1031             }
1032
1033             InputCallbacksPending = 0;
1034             for (k=0; k < numInputBuffers; k++) {            
1035                 pInputBufferHeader[k]->nFlags = 0; 
1036                 
1037 #ifdef OMX_GETTIME
1038                 if (k==0)
1039                 { 
1040                     GT_FlagE=1;  /* 1 = First Buffer,  0 = Not First Buffer  */
1041                     GT_START(); /* Empty Bufffer */
1042                 }
1043 #endif
1044
1045                 error = send_input_buffer (pHandle, pInputBufferHeader[k], fIn);
1046             }   
1047
1048             if (audioinfo->dasfMode == 0) {
1049                 for (k=0; k < numOutputBuffers; k++) {
1050                     pOutputBufferHeader[k]->nFlags = 0;
1051                     
1052 #ifdef OMX_GETTIME
1053                     if (k==0)
1054                     { 
1055                         GT_FlagF=1;  /* 1 = First Buffer,  0 = Not First Buffer  */
1056                         GT_START(); /* Fill Buffer */
1057                     }
1058 #endif
1059
1060                     pComponent->FillThisBuffer(pHandle,  pOutputBufferHeader[k]);
1061                 }
1062             } 
1063             error = pComponent->GetState(pHandle, &state);
1064             retval = 1;
1065             SendInputBuffer = 0;
1066             EOFevent = 0;
1067             frmCount = 0;
1068             OutBufCount = 0;
1069             InBufCount = 0;
1070             while( (error == OMX_ErrorNone) && ((state != OMX_StateIdle) || (retval>0))  ) {
1071                 FD_ZERO(&rfds);
1072                 FD_SET(IpBuf_Pipe[0], &rfds);
1073                 FD_SET(OpBuf_Pipe[0], &rfds);
1074                 tv.tv_sec = 1;
1075                 tv.tv_usec = 0;
1076         
1077                 retval = select(fdmax+1, &rfds, NULL, NULL, &tv);
1078                 if(retval == -1) {
1079                     perror("select()");
1080                     printf ( " : Error \n");
1081                     break;
1082                 }
1083                 APP_DPRINT("Input Callbacks pending = %d, Output Last Pending = %d\n", InputCallbacksPending, OutputLastPending);
1084                 if( (retval == 0)  &&  (InputCallbacksPending < 1) && (!OutputLastPending) ) {
1085                     APP_DPRINT ("%d :: BasicFn App Timeout !!!!!!!!!!! \n",__LINE__);       
1086                     fprintf(stderr, "Shutting down Since there is nothing else to send nor read---------- \n");
1087                     StopComponent(pHandle);
1088                 }
1089                 
1090                 /* FREE input buffer */
1091                 if(FD_ISSET(IpBuf_Pipe[0], &rfds)) {        
1092                     read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer)); 
1093                     InputCallbacksPending--;
1094                     InBufCount++;                
1095                     frmCount+=packetsPerBuffer;                                
1096                     APP_DPRINT("frame count = %d\n", frmCount);
1097                     if(pBuffer->nFlags==1){      /* Last input buffer received by App    */
1098                         InputCallbacksPending = 0;
1099                     }                  
1100                     if( ((2==command) || (4==command)) && (600 == frmCount)){ /*Stop Tests*/
1101                         fprintf(stderr, "Send STOP Command to component ---------- \n");
1102                         StopComponent(pHandle);
1103                     }  
1104                                         
1105                     pBuffer->nFlags = 0;
1106
1107                     if (state == OMX_StateExecuting){
1108                         if(!EOFevent){
1109                             error = send_input_buffer (pHandle, pBuffer, fIn); 
1110                         }
1111                         else{
1112                             printf("EOF, not sending input\n");
1113                         }
1114                         if (error != OMX_ErrorNone) { 
1115                             bExitOnError = OMX_TRUE;
1116                             goto EXIT; 
1117                         } 
1118                     }
1119                            
1120                     if(3 == command){ /*Pause Test*/
1121                         if(frmCount == 100) {   /*100 Frames processed */
1122                             printf (" Sending Pause command to Codec \n");
1123                             PauseComponent(pHandle);
1124                             printf("5 secs sleep...\n");
1125                             sleep(5);
1126                             printf (" Sending Resume command to Codec \n");
1127                             PlayComponent(pHandle);
1128                         }                               
1129                     }
1130                     else if ( 7 == command ){       /*Mute and UnMuteTest*/
1131                         if(frmCount == 100){ 
1132                             printf("************Mute the playback stream*****************\n"); 
1133                             pCompPrivateStructMute->bMute = OMX_TRUE; 
1134                             error = OMX_SetConfig(pHandle, OMX_IndexConfigAudioMute, pCompPrivateStructMute); 
1135                             if (error != OMX_ErrorNone) 
1136                             { 
1137                                 error = OMX_ErrorBadParameter; 
1138                                 bExitOnError = OMX_TRUE;
1139                                 goto EXIT; 
1140                             } 
1141                         } 
1142                         else if(frmCount == 400) { 
1143                             printf("************Unmute the playback stream*****************\n"); 
1144                             pCompPrivateStructMute->bMute = OMX_FALSE; 
1145                             error = OMX_SetConfig(pHandle, OMX_IndexConfigAudioMute, pCompPrivateStructMute); 
1146                             if (error != OMX_ErrorNone) { 
1147                                 error = OMX_ErrorBadParameter; 
1148                                 bExitOnError = OMX_TRUE;
1149                                 goto EXIT; 
1150                             } 
1151                         }
1152                     }
1153                     else if ( 8 == command ) { /*Set Volume Test*/
1154                         if(frmCount == 600){
1155                             printf("************Set stream volume to high*****************\n"); 
1156                             pCompPrivateStructVolume->sVolume.nValue = 0x7500; 
1157                             error = OMX_SetConfig(pHandle, OMX_IndexConfigAudioVolume, pCompPrivateStructVolume); 
1158                             if (error != OMX_ErrorNone) { 
1159                                 error = OMX_ErrorBadParameter; 
1160                                 bExitOnError = OMX_TRUE;
1161                                 goto EXIT; 
1162                             } 
1163                         }
1164                         else if(frmCount == 1200) { 
1165                             printf("************Set stream volume to low*****************\n"); 
1166                             pCompPrivateStructVolume->sVolume.nValue = 0x2500; 
1167                             error = OMX_SetConfig(pHandle, OMX_IndexConfigAudioVolume, pCompPrivateStructVolume); 
1168                             if (error != OMX_ErrorNone) { 
1169                                 error = OMX_ErrorBadParameter; 
1170                                 bExitOnError = OMX_TRUE;
1171                                 goto EXIT; 
1172                             } 
1173                         }                      
1174                     }
1175                 }
1176
1177                 if( FD_ISSET(OpBuf_Pipe[0], &rfds)) {     
1178                     read(OpBuf_Pipe[0], &pBuf, sizeof(pBuf));
1179                     APP_DPRINT("reading from output buffer pipe\n");
1180                     OutBufCount++;
1181                     if ((state != OMX_StateExecuting) && (pBuf->nFilledLen > 0)){
1182                         printf("Writing remaining output buffer\n");
1183                     }
1184                     APP_DPRINT ("FWRITE output buffer of size %d\n",pBuf->nFilledLen);
1185                     if(pBuf->nFlags!=1){
1186                         fwrite(pBuf->pBuffer, 1, pBuf->nFilledLen, fOut);
1187                         fflush(fOut);
1188                         if (state == OMX_StateExecuting ) {
1189                             pComponent->FillThisBuffer(pHandle, pBuf);                                         
1190                         }
1191                     }
1192                     else{/* Last output frame = dummy frame from DSP */
1193                         OutputLastPending = 0;
1194                         InputCallbacksPending = 0;
1195                         pBuf->nFlags = 0;
1196                     }
1197                 }            
1198                 error = pComponent->GetState(pHandle, &state);
1199                 if(error != OMX_ErrorNone) {
1200                     printf("%d:: Warning:  hG729Decoder->GetState has returned status %X\n", __LINE__, error);
1201                     bExitOnError = OMX_TRUE;
1202                     goto EXIT;
1203                 }
1204             } /* While Loop Ending Here */
1205             if(audioinfo->dasfMode == 0){
1206                 fclose(fOut);
1207             }
1208             fclose(fIn);    
1209             fclose(fp);
1210             printf("Number of free input buffers received by test app. : %d\n",InBufCount);
1211             printf("Number of free output buffers received by test app. : %d\n",OutBufCount); 
1212             if((command == 2) || (( command == 5)&&(audioinfo->dasfMode == 0)) || (( command == 6)&&(audioinfo->dasfMode == 0))) {
1213                 sleep (2);
1214             }
1215         } /*Inner for loop ends here */
1216
1217                 
1218         printf("Free buffers\n");
1219         /* free buffers */
1220         for (i=0; i < numInputBuffers; i++) {
1221             error = OMX_FreeBuffer(pHandle,OMX_DirInput,pInputBufferHeader[i]);
1222             if( (error != OMX_ErrorNone)) {
1223                 APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
1224                 bExitOnError = OMX_TRUE;
1225                 goto EXIT;
1226             }
1227             if(pInBufferParam[i] != NULL){
1228                 free(pInBufferParam[i]);
1229                 pInBufferParam[i] = NULL;
1230             }
1231         }
1232         for (i=0; i < numOutputBuffers; i++) {
1233             error = OMX_FreeBuffer(pHandle,OMX_DirOutput,pOutputBufferHeader[i]);
1234             if( (error != OMX_ErrorNone)) {
1235                 APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
1236                 bExitOnError = OMX_TRUE;
1237                 goto EXIT;
1238             }
1239         }
1240
1241 #ifdef USE_BUFFER
1242         /* free the App Allocated Buffers */
1243         printf("%d :: App: Freeing the App Allocated Buffers in TestApp\n",__LINE__);
1244         for(i=0; i < numInputBuffers; i++) {    
1245             pInputBuffer[i] = pInputBuffer[i] - CACHE_ALIGNMENT;
1246             APP_MEMPRINT("%d :: App: [TESTAPPFREE] pInputBuffer[%d] = %p\n",__LINE__,i,pInputBuffer[i]);
1247             if(pInputBuffer[i] != NULL){
1248                 free(pInputBuffer[i]);
1249                 pInputBuffer[i] = NULL;;
1250             }
1251
1252         }
1253
1254         for(i=0; i < numOutputBuffers; i++) {
1255             pOutputBuffer[i] = pOutputBuffer[i] - 128;
1256             APP_MEMPRINT("%d :: App: [TESTAPPFREE] pOutputBuffer[%d] = %p\n",__LINE__,i, pOutputBuffer[i]);
1257             if(pOutputBuffer[i] != NULL){
1258                 free(pOutputBuffer[i]);
1259                 pOutputBuffer[i] = NULL;  
1260             }
1261         }
1262 #endif
1263         printf ("Sending the StateLoaded Command\n");
1264                 
1265 #ifdef OMX_GETTIME
1266         GT_START();
1267 #endif
1268
1269         error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateLoaded, NULL);
1270         error = WaitForState(pHandle, OMX_StateLoaded);
1271 #ifdef OMX_GETTIME
1272         GT_END("Call to SendCommand <OMX_StateLoaded>");
1273 #endif
1274
1275         if(error != OMX_ErrorNone) {
1276             APP_DPRINT ("%d:: Error from SendCommand-Idle State function\n",__LINE__);
1277             bExitOnError = OMX_TRUE;
1278             goto EXIT;
1279         }
1280                 
1281         error = OMX_SendCommand(pHandle, OMX_CommandPortDisable, -1, NULL);
1282
1283         printf ("Free the Component handle\n");
1284         /* Unload the G729 Decoder Component */
1285         error = TIOMX_FreeHandle(pHandle);
1286         if( (error != OMX_ErrorNone)) {
1287             APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
1288             goto EXIT;
1289         }
1290         APP_DPRINT ("%d:: Free Handle returned Successfully \n\n\n\n",__LINE__);
1291         free(pG729Param);
1292         free(pPcmParam);
1293         free(pCompPrivateStruct);
1294         free(pCompPrivateStructMute);
1295         free(pCompPrivateStructVolume);
1296         close(IpBuf_Pipe[0]);
1297         close(IpBuf_Pipe[1]);
1298         close(OpBuf_Pipe[0]);
1299         close(OpBuf_Pipe[1]);
1300         APP_DPRINT("Freed resources successfully\n");
1301     } /*Outer for loop ends here */
1302     free(audioinfo);
1303             
1304     /* De-Initialize OMX Core */
1305     error = TIOMX_Deinit();
1306     if (error != OMX_ErrorNone) {
1307         printf("APP::Failed to de-init OMX Core!\n");
1308     }
1309             
1310 #ifdef DSP_RENDERING_ON
1311     cmd_data.hComponent = pHandle;
1312     cmd_data.AM_Cmd = AM_Exit;
1313     if((write(g729decfdwrite, &cmd_data, sizeof(cmd_data)))<0)
1314     {
1315         printf("%d ::OMX_G729Decoder.c :: [G729 Dec Component] - send command to audio manager\n",__LINE__);
1316     }
1317     close(g729decfdwrite);
1318     close(g729decfdread);
1319 #endif    
1320
1321  EXIT:
1322
1323     if (bExitOnError){
1324 #ifdef USE_BUFFER    
1325         FreeResources(pG729Param, pPcmParam, pCompPrivateStruct, 
1326                       pCompPrivateStructMute, pCompPrivateStructVolume, 
1327                       audioinfo, pInputBuffer, pOutputBuffer, pInBufferParam, pHandle); 
1328 #else
1329
1330         FreeResources(pG729Param, pPcmParam, pCompPrivateStruct, 
1331                       pCompPrivateStructMute, pCompPrivateStructVolume, 
1332                       audioinfo, pInputBufferHeader, pOutputBufferHeader, pInBufferParam, pHandle); 
1333 #endif
1334         error = TIOMX_FreeHandle(pHandle);
1335         if( (error != OMX_ErrorNone)) {
1336             APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
1337             goto EXIT;
1338         }
1339     }
1340
1341 #ifdef OMX_GETTIME
1342     GT_END("G729_DEC test <End>");
1343     OMX_ListDestroy(pListHead);     
1344 #endif 
1345
1346 #ifdef MTRACE
1347     muntrace();
1348 #endif
1349
1350     return error;
1351 }
1352
1353 OMX_ERRORTYPE send_input_buffer(OMX_HANDLETYPE pHandle, OMX_BUFFERHEADERTYPE* pBuffer, FILE *fIn)
1354 {
1355     OMX_ERRORTYPE error = OMX_ErrorNone;
1356     OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)pHandle;
1357     OMX_S16 status = 0;
1358
1359     status = fill_data_fromFile (pBuffer, fIn, pHandle);
1360     pBuffer->nTimeStamp = (OMX_S64) rand() % 70;
1361     pBuffer->nTickCount = (OMX_S64) rand() % 70;
1362     if (command == 0){
1363         APP_DPRINT("SENDING TIMESTAMP = %d\n", (int) pBuffer->nTimeStamp);
1364         APP_DPRINT("SENDING TICK COUNT = %ld\n", pBuffer->nTickCount);
1365     }
1366     if(status>=0){
1367         SendInputBuffer++;
1368         InputCallbacksPending++;  
1369         pComponent->EmptyThisBuffer(pHandle, pBuffer);
1370     }
1371     else{
1372         error = OMX_ErrorStreamCorrupt;  
1373     } 
1374     return error;
1375 }
1376
1377  
1378 /* ===========================================================================*/
1379 /**
1380  * @fn fill_data_fromFile fills input buffer with 1 G729 frame from input test file
1381  * Conversion from ITU format to frame type header + G729 packet
1382  *
1383  */
1384 /* ===========================================================================*/
1385 OMX_S16 fill_data_fromFile (OMX_BUFFERHEADERTYPE *pBuf, FILE *fIn, OMX_HANDLETYPE  pHandle)
1386 {
1387     OMX_S16 nRead = 0;
1388     OMX_S16 nRead2 = 0;
1389     OMX_S16 dRead = 0;
1390     OMX_S16 j = 0, n = 0, k = 0, m = 0;
1391     /* BFI + number of bit in frame + serial bitstream */
1392     OMX_S16 serial[ITU_INPUT_SIZE];
1393     /* G729 frame type */
1394     OMX_S16 frame_type = 0;
1395     /* Number of data bytes in packet */
1396     OMX_U32 nBytes = 0;
1397     /* G729 packet */
1398     OMX_U8 *packet = NULL;
1399     /* Offset in bytes in input buffer */
1400     OMX_U8 offset = 0;
1401     G729DEC_BufParamStruct* pBufStructTemp = (G729DEC_BufParamStruct*)pBuf->pInputPortPrivate; 
1402
1403
1404     pBufStructTemp->frameLost = 0;
1405     pBufStructTemp->numPackets = packetsPerBuffer;
1406     pBufStructTemp->bNoUseDefaults = OMX_TRUE;
1407     pBuf->nFilledLen = 0;
1408     pBuf->nFlags = 0;
1409     for(j = 0; j < packetsPerBuffer; j++){      /* nb packets in input buffer */
1410
1411         nRead2=fread(serial, sizeof(OMX_S16), 2 , fp); //this is temporary
1412         /* read BFI and number of bits in frame */
1413         nRead = fread(serial, sizeof(OMX_S16), 2 , fIn);
1414         if(nRead != 0){
1415             /* Number of data bytes in packet */
1416             nBytes = serial[1]>>3;
1417             pBufStructTemp->packetLength[j] = nBytes + 1;
1418             pBuf->nFilledLen += pBufStructTemp->packetLength[j]; 
1419             /* read ITU serial bitstream  */
1420             dRead = fread(&serial[2], sizeof(OMX_S16), serial[1], fIn);
1421             if(dRead != serial[1]){
1422                 printf("WARN: Error in input file\n");
1423                 dRead = -1; /*error flag */
1424             }
1425             /* set frame type */
1426             switch(nBytes){
1427             case G729SPEECHPACKETSIZE:
1428                 frame_type = SPEECH_FRAME_TYPE;
1429                 break;
1430             case G729SIDPACKETSIZE:
1431                 frame_type = SID_FRAME_TYPE;
1432                 break;
1433             case NO_TX_FRAME_TYPE:
1434                 frame_type = NO_TX_FRAME_TYPE;
1435                 break;
1436             default:
1437                 frame_type = ERASURE_FRAME;
1438             }
1439             if(serial[0]!= SYNC_WORD){  /* Untransmitted frame => Frame erasure flag */
1440                 frame_type = ERASURE_FRAME;
1441             }       
1442             /* Add G729 frame type header to G729 input packet */
1443             *((OMX_U8 *)(&pBuf->pBuffer[0]+offset)) = frame_type;
1444              
1445             /* Convert ITU format to bitstream */
1446             packet = (OMX_U8 *)(&pBuf->pBuffer[0]+offset+1);
1447             if(frame_type == SPEECH_FRAME_TYPE){
1448                 n = 2;
1449                 k = 0;
1450                 while(n<SPEECH_FRAME_SIZE){
1451                     packet[k] = 0;
1452                     for(m=7;m>=0;m--){
1453                         serial[n] = (~(serial[n]) & 0x2)>>1;
1454                         packet[k] = packet[k] + (serial[n]<<m);
1455                         n++;
1456                     }
1457                     k++;
1458                 }
1459             }
1460             if(frame_type == SID_FRAME_TYPE){
1461                 n = 2;
1462                 k = 0;
1463                 while(n<SID_OCTET_FRAME_SIZE){
1464                     packet[k] = 0;
1465                     for(m=7;m>=0;m--){
1466                         serial[n] = (~(serial[n]) & 0x2)>>1;
1467                         packet[k] = packet[k] + (serial[n]<<m);
1468                         n++;
1469                     }
1470                     k++;
1471                 }
1472             }                       
1473             offset = offset + nBytes + 1;
1474         }
1475         else{
1476             if(offset == 0){/* End of file on a dummy frame */
1477                 /* Set flag on input buffer to indicate Last Frame */
1478                 pBuf->nFlags=OMX_BUFFERFLAG_EOS;
1479                 /* Dummy buffer (no data) */
1480                 pBuf->nFilledLen = 0;
1481                 EOFevent = 1;
1482                 printf("End of file on a dummy frame \n");
1483             }
1484             else{/* End of file on valid frame */
1485                 pBuf->nFlags=OMX_BUFFERFLAG_EOS;
1486                 EOFevent = 1;
1487                 printf("End of file on a valid frame \n");
1488             }
1489             if(dasfMode==0){
1490                 OutputLastPending = 1;
1491             } 
1492             j = packetsPerBuffer;  /* break */
1493         }
1494     }
1495     return dRead;
1496 }
1497
1498 void ConfigureAudio()
1499 {
1500     int Mixer = 0, arg = 0, status = 0;
1501
1502     Mixer = open("/dev/sound/mixer", O_WRONLY);
1503     if (Mixer < 0) {
1504         perror("open of /dev/sound/mixer failed");
1505         exit(1);
1506     }
1507     arg = G729DEC_SAMPLING_FREQUENCY;          /* sampling rate */
1508     printf("Sampling freq set to:%d\n",arg);
1509     status = ioctl(Mixer, SOUND_PCM_WRITE_RATE, &arg);
1510     if (status == -1) {
1511         perror("SOUND_PCM_WRITE_RATE ioctl failed");
1512         printf("sample rate set to %u\n", arg);
1513     }
1514     arg = AFMT_S16_LE;                  /* AFMT_S16_LE or AFMT_S32_LE */
1515     status = ioctl(Mixer, SOUND_PCM_SETFMT, &arg);
1516     if (status == -1) {
1517         perror("SOUND_PCM_SETFMT ioctl failed");
1518         printf("Bitsize set to %u\n", arg);
1519     }
1520     arg = 2;                    /* Channels mono 1 stereo 2 */
1521     status = ioctl(Mixer, SOUND_PCM_WRITE_CHANNELS, &arg);
1522     if (status == -1) {
1523         perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");
1524         printf("Channels set to %u\n", arg);
1525     }
1526     arg = GAIN<<8|GAIN;
1527     status = ioctl(Mixer, SOUND_MIXER_WRITE_VOLUME, &arg);
1528     if (status == -1) {
1529         perror("SOUND_MIXER_WRITE_VOLUME ioctl failed");
1530         printf("Volume set to %u\n", arg);
1531     }
1532 }
1533
1534 OMX_ERRORTYPE StopComponent(OMX_HANDLETYPE *pHandle)
1535 {
1536     OMX_ERRORTYPE error = OMX_ErrorNone;
1537     
1538 #ifdef OMX_GETTIME
1539     GT_START();
1540 #endif
1541
1542     error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL);
1543     if(error != OMX_ErrorNone) {
1544         fprintf (stderr,"\nError from SendCommand-Idle(Stop) State function!!!!!!!!\n");
1545         goto EXIT;
1546     }
1547     error = WaitForState(pHandle, OMX_StateIdle);
1548         
1549 #ifdef OMX_GETTIME
1550     GT_END("Call to SendCommand <OMX_StateIdle>");
1551 #endif
1552
1553     if(error != OMX_ErrorNone) {
1554         fprintf(stderr, "\nError:  hG729Decoder->WaitForState reports an error %X!!!!!!!\n", error);
1555         goto EXIT;
1556     }
1557  EXIT:
1558     return error;
1559 }
1560
1561 OMX_ERRORTYPE PauseComponent(OMX_HANDLETYPE *pHandle)
1562 {
1563     OMX_ERRORTYPE error = OMX_ErrorNone;
1564     
1565 #ifdef OMX_GETTIME
1566     GT_START();
1567 #endif
1568
1569     error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StatePause, NULL);
1570     if(error != OMX_ErrorNone) {
1571         fprintf (stderr,"\nError from SendCommand-Pasue State function!!!!!!\n");
1572         goto EXIT;
1573     }
1574     error = WaitForState(pHandle, OMX_StatePause);
1575     
1576 #ifdef OMX_GETTIME
1577     GT_END("Call to SendCommand <OMX_StatePause>");
1578 #endif
1579
1580     if(error != OMX_ErrorNone) {
1581         fprintf(stderr, "\nError:  hG729Decoder->WaitForState reports an error %X!!!!!!!\n", error);
1582         goto EXIT;
1583     }
1584  EXIT:
1585     return error;
1586 }
1587
1588 OMX_ERRORTYPE PlayComponent(OMX_HANDLETYPE *pHandle)
1589 {
1590     OMX_ERRORTYPE error = OMX_ErrorNone;
1591 #ifdef OMX_GETTIME
1592     GT_START();
1593 #endif
1594     error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateExecuting, NULL);
1595     if(error != OMX_ErrorNone) {
1596         fprintf (stderr,"\nError from SendCommand-Executing State function!!!!!!!\n");
1597         goto EXIT;
1598     }
1599     error = WaitForState(pHandle, OMX_StateExecuting);
1600 #ifdef OMX_GETTIME
1601     GT_END("Call to SendCommand <OMX_StateExecuting>");
1602 #endif
1603     if(error != OMX_ErrorNone) {
1604         fprintf(stderr, "\nError:  hG729Decoder->WaitForState reports an error %X!!!!!!!\n", error);
1605         goto EXIT;
1606     }
1607  EXIT:
1608     return error;
1609 }
1610
1611 #ifdef USE_BUFFER
1612 OMX_ERRORTYPE FreeResources(OMX_AUDIO_PARAM_G729TYPE* pG729Param, 
1613                             OMX_AUDIO_PARAM_PCMMODETYPE* pPcmParam,
1614                             OMX_PARAM_PORTDEFINITIONTYPE* pCompPrivateStruct, 
1615                             OMX_AUDIO_CONFIG_MUTETYPE* pCompPrivateStructMute, 
1616                             OMX_AUDIO_CONFIG_VOLUMETYPE* pCompPrivateStructVolume,
1617                             TI_OMX_DSP_DEFINITION* audioinfo, 
1618                             OMX_U8* pInputBuffer[10],
1619                             OMX_U8* pOutputBuffer[10],
1620                             G729DEC_BufParamStruct* pInBufferParam[10],
1621                             OMX_HANDLETYPE* pHandle)
1622 {
1623     OMX_ERRORTYPE eError = OMX_ErrorNone;
1624     int i = 0;
1625     
1626     printf("Free buffers\n");
1627     /* free buffers */
1628     for (i=0; i < numInputBuffers; i++) {
1629         eError = OMX_FreeBuffer(pHandle,OMX_DirInput,pInputBufferHeader[i]);
1630         if( (eError != OMX_ErrorNone)) {
1631             APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
1632             goto EXIT;
1633         }
1634         if(pInBufferParam[i] != NULL){
1635             free(pInBufferParam[i]);
1636             pInBufferParam[i] = NULL;
1637         }
1638     }
1639
1640     for (i=0; i < numOutputBuffers; i++) {
1641         eError = OMX_FreeBuffer(pHandle,OMX_DirOutput,pOutputBufferHeader[i]);
1642         if( (eError != OMX_ErrorNone)) {
1643             APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
1644             printf("%d:: Error in Free Handle function\n",__LINE__);
1645             goto EXIT;
1646         }
1647     }
1648     free(pG729Param);
1649     free(pPcmParam);
1650     free(pCompPrivateStruct);
1651     free(pCompPrivateStructMute);
1652     free(pCompPrivateStructVolume);
1653      
1654     close(IpBuf_Pipe[0]);
1655     close(IpBuf_Pipe[1]);
1656     close(OpBuf_Pipe[0]);
1657     close(OpBuf_Pipe[1]);
1658     free(audioinfo);
1659     
1660  EXIT:
1661     return eError;
1662 }
1663
1664 #else
1665
1666 OMX_ERRORTYPE FreeResources(OMX_AUDIO_PARAM_G729TYPE* pG729Param, 
1667                             OMX_AUDIO_PARAM_PCMMODETYPE* pPcmParam,
1668                             OMX_PARAM_PORTDEFINITIONTYPE* pCompPrivateStruct, 
1669                             OMX_AUDIO_CONFIG_MUTETYPE* pCompPrivateStructMute, 
1670                             OMX_AUDIO_CONFIG_VOLUMETYPE* pCompPrivateStructVolume,
1671                             TI_OMX_DSP_DEFINITION* audioinfo, 
1672                             OMX_BUFFERHEADERTYPE* pInputBufferHeader[10],
1673                             OMX_BUFFERHEADERTYPE* pOutputBufferHeader[10],
1674                             G729DEC_BufParamStruct* pInBufferParam[10],
1675                             OMX_HANDLETYPE* pHandle)
1676 {
1677     OMX_ERRORTYPE eError = OMX_ErrorNone;
1678     int i = 0;
1679     
1680     printf("Free buffers\n");
1681     /* free buffers */
1682     for (i=0; i < numInputBuffers; i++) {
1683         eError = OMX_FreeBuffer(pHandle,OMX_DirInput,pInputBufferHeader[i]);
1684         if( (eError != OMX_ErrorNone)) {
1685             APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
1686             goto EXIT;
1687         }
1688         if(pInBufferParam[i] != NULL){
1689             free(pInBufferParam[i]);
1690             pInBufferParam[i] = NULL;
1691         }
1692     }
1693     for (i=0; i < numOutputBuffers; i++) {
1694         eError = OMX_FreeBuffer(pHandle,OMX_DirOutput,pOutputBufferHeader[i]);
1695         if( (eError != OMX_ErrorNone)) {
1696             APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
1697             printf("%d:: Error in Free Handle function\n",__LINE__);
1698             goto EXIT;
1699         }
1700     }
1701     free(pG729Param);
1702     free(pPcmParam);
1703     free(pCompPrivateStruct);
1704     free(pCompPrivateStructMute);
1705     free(pCompPrivateStructVolume); 
1706     close(IpBuf_Pipe[0]);
1707     close(IpBuf_Pipe[1]);
1708     close(OpBuf_Pipe[0]);
1709     close(OpBuf_Pipe[1]);
1710     free(audioinfo);
1711
1712  EXIT:
1713     return eError;
1714 }
1715 #endif