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 OMX_G726DecTest.c
26 *
27 * This file contains the test application code that invokes the component.
28 *
29 * @path  $(CSLPATH)\OMAPSW_MPU\linux\audio\src\openmax_il\g726_dec\tests
30 *
31 * @rev  1.0
32 */
33/* ----------------------------------------------------------------------------
34 *!
35 *! Revision History
36 *! ===================================
37 *! This is newest file
38 * =========================================================================== */
39/* ------compilation control switches -------------------------*/
40/****************************************************************
41 *  INCLUDE FILES
42 ****************************************************************/
43/* ----- system and platform files ----------------------------*/
44#include <unistd.h>
45#include <stdlib.h>
46#include <sys/ioctl.h>
47#include <sys/select.h>
48#include <string.h>
49#include <stdio.h>
50#include <fcntl.h>
51#include <errno.h>
52#include <linux/vt.h>
53#include <signal.h>
54#include <sys/stat.h>
55#include <OMX_Index.h>
56#include <OMX_Types.h>
57#include <OMX_Core.h>
58#include <OMX_Audio.h>
59#include <OMX_Component.h>
60#include <TIDspOmx.h>
61#include <pthread.h>
62#include <stdio.h>
63#include <linux/soundcard.h>
64
65#ifdef OMX_GETTIME
66#include <OMX_Common_Utils.h>
67#include <OMX_GetTime.h>     /*Headers for Performance & measuremet */d
68#endif
69
70#undef MTRACE
71#ifdef MTRACE
72#include <mcheck.h>
73#endif
74
75#undef APP_DEBUG
76#undef APP_STATEDETAILS
77
78#undef USE_BUFFER
79
80#ifdef APP_DEBUG
81#define APP_DPRINT(...)    fprintf(stderr,__VA_ARGS__)
82#else
83#define APP_DPRINT(...)
84#endif
85
86
87#ifdef APP_STATEDETAILS
88#define APP_STATEPRINT(...)    fprintf(stderr,__VA_ARGS__)
89#else
90#define APP_STATEPRINT(...)
91#endif
92
93#define APP_OUTPUT_FILE "output.pcm"
94#define SLEEP_TIME 2
95
96#define G726_APP_ID  100 /* Defines G726 Dec App ID, App must use this value */
97#define INVALID_SAMPLING_FREQ  51 /*Do not change; fixed for component!*/
98#define MAX_NUM_OF_BUFS 10         /*Do not change; fixed for component!*/
99#define EOS_MIN_SIZE 2
100
101#ifdef OMX_GETTIME
102OMX_ERRORTYPE eError = OMX_ErrorNone;
103int GT_FlagE = 0;  /* Fill Buffer 1 = First Buffer,  0 = Not First Buffer  */
104int GT_FlagF = 0;  /*Empty Buffer  1 = First Buffer,  0 = Not First Buffer  */
105static OMX_NODE* pListHead = NULL;
106#endif
107
108
109int nIpBuffs = 1;
110int nOpBuffs = 1;
111int tcID = 0;
112
113int nIpBufSize = 20; /*default value */
114int nOpBufSize = 160; /* default value */
115
116int gDasfMode = 0;
117unsigned short packingType = 0;
118int bitRate = 0;
119int playcompleted = 0;
120
121OMX_STATETYPE gState = OMX_StateExecuting;
122
123#define FIFO1 "/dev/fifo.1"
124#define FIFO2 "/dev/fifo.2"
125
126#define LINEAR_PACKING 0
127#define RTP_PACKING 1
128
129int fdwrite = 0;
130int fdread = 0;
131
132
133int maxint(int a, int b);
134
135int fill_data (OMX_BUFFERHEADERTYPE *pBuf, FILE *fIn);
136
137OMX_STRING strG726Decoder = "OMX.TI.G726.decode";
138
139int IpBuf_Pipe[2] = {0};
140int OpBuf_Pipe[2] = {0};
141
142
143OMX_ERRORTYPE send_input_buffer (OMX_HANDLETYPE pHandle, OMX_BUFFERHEADERTYPE* pBuffer, FILE *fIn);
144
145fd_set rfds;
146
147
148/* ================================================================================= * */
149/**
150 * @fn maxint() gives the maximum of two integers.
151 *
152 * @param a intetger a
153 *
154 * @param b integer b
155 *
156 * @pre          None
157 *
158 * @post         None
159 *
160 *  @return      bigger number
161 *
162 *  @see         None
163 */
164/* ================================================================================ * */
165int maxint(int a, int b)
166{
167    return (a>b) ? a : b;
168}
169
170/* ================================================================================= * */
171/**
172 * @fn WaitForState() Waits for the state to change.
173 *
174 * @param pHandle This is component handle allocated by the OMX core.
175 *
176 * @param DesiredState This is state which the app is waiting for.
177 *
178 * @pre          None
179 *
180 * @post         None
181 *
182 *  @return      Appropriate OMX Error.
183 *
184 *  @see         None
185 */
186/* ================================================================================ * */
187static OMX_ERRORTYPE WaitForState(OMX_HANDLETYPE* pHandle,
188                                  OMX_STATETYPE DesiredState)
189{
190    OMX_STATETYPE CurState = OMX_StateInvalid;
191    OMX_ERRORTYPE eError = OMX_ErrorNone;
192    int nCnt = 0;
193
194    eError = OMX_GetState(*pHandle, &CurState);
195    while( (eError == OMX_ErrorNone) &&
196           (CurState != DesiredState) && (eError == OMX_ErrorNone) ) {
197        sched_yield();
198        if(nCnt++ == 10) {
199            APP_DPRINT( "Still Waiting, press CTL-C to continue\n");
200        }
201        eError = OMX_GetState(*pHandle, &CurState);
202    }
203
204    return eError;
205}
206
207
208/* ================================================================================= * */
209/**
210 * @fn EventHandler() This is event handle which is called by the component on
211 * any event change.
212 *
213 * @param hComponent This is component handle allocated by the OMX core.
214 *
215 * @param pAppData This is application private data.
216 *
217 * @param eEvent  This is event generated from the component.
218 *
219 * @param nData1  Data1 associated with the event.
220 *
221 * @param nData2  Data2 associated with the event.
222 *
223 * @param pEventData Any other string event data from component.
224 *
225 * @pre          None
226 *
227 * @post         None
228 *
229 *  @return      Appropriate OMX error.
230 *
231 *  @see         None
232 */
233/* ================================================================================ * */
234OMX_ERRORTYPE EventHandler(OMX_HANDLETYPE hComponent,OMX_PTR pAppData,OMX_EVENTTYPE eEvent,
235                           OMX_U32 nData1, OMX_U32 nData2, OMX_PTR pEventData)
236{
237    switch (eEvent)
238    {
239    case OMX_EventCmdComplete:
240        gState = (OMX_STATETYPE)nData2;
241        break;
242    case OMX_EventError:
243    case OMX_EventMax:
244    case OMX_EventMark:
245    case OMX_EventPortSettingsChanged:
246    case OMX_EventBufferFlag:
247        if(nData2 == (OMX_U32)OMX_BUFFERFLAG_EOS){
248            /*                playcompleted = 1;
249                              printf("playcomplted set true:: %d\n", __LINE__); */
250        }
251        break;
252    case OMX_EventResourcesAcquired:
253    case OMX_EventComponentResumed:
254    case OMX_EventDynamicResourcesAvailable:
255    case OMX_EventPortFormatDetected:
256        break;
257    }
258
259    return OMX_ErrorNone;
260}
261
262/* ================================================================================= * */
263/**
264 * @fn FillBufferDone() Component sens the output buffer to app using this
265 * callback.
266 *
267 * @param hComponent This is component handle allocated by the OMX core.
268 *
269 * @param ptr This is another pointer.
270 *
271 * @param pBuffer This is output buffer.
272 *
273 * @pre          None
274 *
275 * @post         None
276 *
277 *  @return      None
278 *
279 *  @see         None
280 */
281/* ================================================================================ * */
282void FillBufferDone (OMX_HANDLETYPE hComponent, OMX_PTR ptr, OMX_BUFFERHEADERTYPE* pBuffer)
283{
284    write(OpBuf_Pipe[1], &pBuffer, sizeof(pBuffer));
285
286#ifdef OMX_GETTIME
287    if (GT_FlagF == 1 ) /* First Buffer Reply*/  /* 1 = First Buffer,  0 = Not First Buffer  */
288    {
289        GT_END("Call to FillBufferDone  <First: FillBufferDone>");
290        GT_FlagF = 0 ;   /* 1 = First Buffer,  0 = Not First Buffer  */
291    }
292#endif
293}
294
295
296/* ================================================================================= * */
297/**
298 * @fn EmptyBufferDone() Component sends the input buffer to app using this
299 * callback.
300 *
301 * @param hComponent This is component handle allocated by the OMX core.
302 *
303 * @param ptr This is another pointer.
304 *
305 * @param pBuffer This is input buffer.
306 *
307 * @pre          None
308 *
309 * @post         None
310 *
311 *  @return      None
312 *
313 *  @see         None
314 */
315/* ================================================================================ * */
316void EmptyBufferDone(OMX_HANDLETYPE hComponent, OMX_PTR ptr, OMX_BUFFERHEADERTYPE* pBuffer)
317{
318    write(IpBuf_Pipe[1], &pBuffer, sizeof(pBuffer));
319
320#ifdef OMX_GETTIME
321    if (GT_FlagE == 1 ) /* First Buffer Reply*/  /* 1 = First Buffer,  0 = Not First Buffer  */
322    {
323        GT_END("Call to EmptyBufferDone <First: EmptyBufferDone>");
324        GT_FlagE = 0;   /* 1 = First Buffer,  0 = Not First Buffer  */
325    }
326#endif
327
328}
329
330/* ================================================================================= * */
331/**
332 * @fn main() This is the main function of application which gets called.
333 *
334 * @param argc This is the number of commandline arguments..
335 *
336 * @param argv[] This is an array of pointers to command line arguments..
337 *
338 * @pre          None
339 *
340 * @post         None
341 *
342 *  @return      An integer value.
343 *
344 *  @see         None
345 */
346/* ================================================================================ * */
347int main(int argc, char* argv[])
348{
349    OMX_CALLBACKTYPE G726CaBa = {(void *)EventHandler,
350                                 (void*)EmptyBufferDone,
351                                 (void*)FillBufferDone};
352    OMX_HANDLETYPE *pHandle = NULL;
353    OMX_ERRORTYPE error = OMX_ErrorNone;
354    OMX_U32 AppData = G726_APP_ID;
355    OMX_PARAM_PORTDEFINITIONTYPE* pCompPrivateStruct = NULL;
356    OMX_AUDIO_CONFIG_MUTETYPE* pCompPrivateStructMute = NULL;
357    OMX_AUDIO_CONFIG_VOLUMETYPE* pCompPrivateStructVolume = NULL;
358    OMX_AUDIO_PARAM_PCMMODETYPE *pPcmParam = NULL;
359    OMX_AUDIO_PARAM_G726TYPE *pG726Param = NULL;
360    TI_OMX_DSP_DEFINITION  *pAppPrivate = NULL;
361    OMX_INDEXTYPE index = 0;
362    OMX_COMPONENTTYPE *pComponent = NULL;
363    OMX_BUFFERHEADERTYPE* pInputBufferHeader[MAX_NUM_OF_BUFS] = {NULL};
364    OMX_BUFFERHEADERTYPE* pOutputBufferHeader[MAX_NUM_OF_BUFS] = {NULL};
365
366    TI_OMX_DATAPATH dataPath;
367    static int totalFilled = 0;
368    int k=0;
369    struct timeval tv;
370    int retval = 0, j = 0;
371    int frmCount = 0;
372    int frmCnt = 1;
373    int testcnt = 1;
374    int testcnt1 = 1;
375    char fname[100] = APP_OUTPUT_FILE;
376    FILE* fIn = NULL;
377    FILE* fOut = NULL;
378
379#ifdef MTRACE
380    mtrace();
381#endif
382
383
384    APP_DPRINT("------------------------------------------------------\n");
385    APP_DPRINT("This is Main Thread In G726 DECODER Test Application:\n");
386    APP_DPRINT("Test Core 1.5 - " __DATE__ ":" __TIME__ "\n");
387    APP_DPRINT("------------------------------------------------------\n");
388#ifdef OMX_GETTIME
389    GTeError = OMX_ListCreate(&pListHead);
390    printf("eError = %d\n",GTeError);
391    GT_START();
392#endif
393    /* check the input parameters */
394    if(argc != 10) {
395        printf("Wrong Arguments: See Below:\n\n");
396        printf("%d :: Usage: [TestApp] [Input File] [Input File Bit Rate] [TC ID]\
397[FM/DM] [NB INPUT BUF] [INPUT BUF SIZE] [NB OUTPUT BUF] [OUTPUT BUF SIZE] [PACKING TYPE]\n",__LINE__);
398        goto EXIT;
399    }
400
401    /* check to see that the input file exists */
402    struct stat sb = {0};
403    int status = stat(argv[1], &sb);
404    if( status != 0 ) {
405        printf( "Cannot find file %s. (%u)\n", argv[1], errno);
406        goto EXIT;
407    }
408
409    error = TIOMX_Init();
410    if(error != OMX_ErrorNone) {
411        APP_DPRINT("%d :: Error returned by OMX_Init()\n",__LINE__);
412        goto EXIT;
413    }
414
415    if(!strcmp(argv[4],"DM")) {
416        gDasfMode = 1;
417    } else if(!strcmp(argv[4],"FM")) {
418        gDasfMode = 0;
419    } else {
420        error = OMX_ErrorBadParameter;
421        printf("\n%d :: App: Sending Bad Parameter for dasf mode\n",__LINE__);
422        printf("%d :: App: Should Be One of these Modes FM or DM\n",__LINE__);
423        goto EXIT;
424    }
425
426    nIpBuffs = atoi(argv[5]);
427    APP_DPRINT("%d :: App: nIpBuf = %d\n",__LINE__, nIpBuffs);
428    nIpBufSize = atoi(argv[6]);
429    APP_DPRINT("%d :: App: nIpBufSize = %d\n",__LINE__, nIpBufSize);
430    nOpBuffs = atoi(argv[7]);
431    APP_DPRINT("%d :: App: nOpBuf = %d\n",__LINE__, nOpBuffs);
432    nOpBufSize = atoi(argv[8]);
433    APP_DPRINT("%d :: App: nOpBufSize = %d\n",__LINE__, nOpBufSize);
434    packingType = atoi(argv[9]);
435    APP_DPRINT("%d :: App: packingType = %d\n",__LINE__, packingType);
436    bitRate = atoi(argv[2]);
437    APP_DPRINT("%d :: App: bit rate = %d\n",__LINE__, bitRate);
438
439    if(!strcmp(argv[3],"0")) {
440        tcID = 0;
441    }
442    else if(!strcmp(argv[3],"1")) {
443        tcID = 1;
444    } else if (!strcmp(argv[3],"2")) {
445        tcID = 2;
446    } else if (!strcmp(argv[3],"3")) {
447        tcID = 3;
448    } else if (!strcmp(argv[3],"4")) {
449        tcID = 4;
450    } else if (!strcmp(argv[3],"5")) {
451        tcID = 5;
452    } else if (!strcmp(argv[3],"6")) {
453        tcID = 6;
454    } else if (!strcmp(argv[3],"7")) {
455        tcID = 7;
456    } else if (!strcmp(argv[3],"8")) {
457        tcID = 8;
458    } else {
459        printf("Invalid Test Case ID: exiting...\n");
460        exit(1);
461    }
462
463
464
465    switch (tcID) {
466    case 1:
467    case 7:
468    case 8:
469        printf ("-------------------------------------\n");
470        printf ("Testing Simple PLAY till EOF \n");
471        printf ("-------------------------------------\n");
472        break;
473    case 2:
474        printf ("-------------------------------------\n");
475        printf ("Testing Basic Stop \n");
476        printf ("-------------------------------------\n");
477        strcat(fname,"_tc2.pcm");
478        break;
479    case 3:
480        printf ("-------------------------------------\n");
481        printf ("Testing PAUSE & RESUME Command\n");
482        printf ("-------------------------------------\n");
483        break;
484    case 4:
485        printf ("---------------------------------------------\n");
486        printf ("Testing STOP Command by Stopping In-Between\n");
487        printf ("---------------------------------------------\n");
488        break;
489    case 5:
490        printf ("-------------------------------------------------\n");
491        printf ("Testing Repeated PLAY without Deleting Component\n");
492        printf ("-------------------------------------------------\n");
493        strcat(fname,"_tc5.pcm");
494        testcnt = 20;
495        break;
496    case 6:
497        printf ("------------------------------------------------\n");
498        printf ("Testing Repeated PLAY with Deleting Component\n");
499        printf ("------------------------------------------------\n");
500        strcat(fname,"_tc6.pcm");
501        testcnt1 = 20;
502        break;
503    }
504
505    /**********************************************************
506                OUTER LOOP STARTS HERE
507    **********************************************************/
508    for(j = 0; j < testcnt1; j++) {
509
510#ifdef DSP_RENDERING_ON
511        if((fdwrite=open(FIFO1,O_WRONLY))<0) {
512            printf("[G726TEST] - failure to open WRITE pipe\n");
513        }
514        else {
515            printf("[G726TEST] - opened WRITE pipe\n");
516        }
517
518        if((fdread=open(FIFO2,O_RDONLY))<0) {
519            printf("[G726TEST] - failure to open READ pipe\n");
520            goto EXIT;
521        }
522        else {
523            printf("[G726TEST] - opened READ pipe\n");
524        }
525#endif
526
527        pHandle = malloc(sizeof(OMX_HANDLETYPE));
528        if(pHandle == NULL){
529            printf("%d :: App: Malloc Failed\n",__LINE__);
530            goto EXIT;
531        }
532#ifdef OMX_GETTIME
533        GT_START();
534        error = OMX_GetHandle(pHandle, strG726Decoder, &AppData, &G726CaBa);
535        GT_END("Call to GetHandle");
536#else
537        error = TIOMX_GetHandle(pHandle, strG726Decoder, &AppData, &G726CaBa);
538#endif
539        if((error != OMX_ErrorNone) || (*pHandle == NULL))
540        {
541            APP_DPRINT ("Error in Get Handle function\n");
542            goto EXIT;
543        }
544        /* Create a pipe used to queue data from the callback. */
545        retval = pipe(IpBuf_Pipe);
546        if( retval != 0) {
547            printf( "Error:Fill Data Pipe failed to open\n");
548            goto EXIT;
549        }
550
551        retval = pipe(OpBuf_Pipe);
552        if( retval != 0) {
553            printf( "Error:Empty Data Pipe failed to open\n");
554            goto EXIT;
555        }
556
557        /* save off the "max" of the handles for the selct statement */
558        int fdmax = maxint(IpBuf_Pipe[0], OpBuf_Pipe[0]);
559
560        if (tcID == 6) {
561            printf("*********************************************************\n");
562            printf("%d :: Decoding for %d time\n",__LINE__, j);
563            printf("*********************************************************\n");
564        }
565
566        /* Send  G726 config for input */
567        pG726Param = malloc (sizeof(OMX_AUDIO_PARAM_G726TYPE));
568        pG726Param->nSize                    = sizeof(OMX_AUDIO_PARAM_G726TYPE);
569        pG726Param->nVersion.s.nVersionMajor = 1;
570        pG726Param->nVersion.s.nVersionMinor = 1;
571        pG726Param->nPortIndex               = OMX_DirInput;
572        pG726Param->nChannels                = 1; /* mono */
573        if (bitRate == 16){
574            pG726Param->eG726Mode = OMX_AUDIO_G726Mode16;
575        }
576        else if(bitRate == 24){
577            pG726Param->eG726Mode = OMX_AUDIO_G726Mode24;
578        }
579        else if(bitRate == 32){
580            pG726Param->eG726Mode = OMX_AUDIO_G726Mode32;
581        }
582        else if(bitRate == 40){
583            pG726Param->eG726Mode = OMX_AUDIO_G726Mode40;
584        }
585        else {
586            printf("Invalid bit rate, please choose from 16, 24, 32, 40 kbps\n");
587            goto EXIT;
588        }
589#ifdef OMX_GETTIME
590        GT_START();
591        error = OMX_SetParameter (*pHandle, OMX_IndexParamAudioG726, pG726Param);
592        GT_END("Set Parameter Test-SetParameter");
593#else
594        error = OMX_SetParameter (*pHandle, OMX_IndexParamAudioG726, pG726Param);
595#endif
596
597        if (error != OMX_ErrorNone)
598        {
599            error = OMX_ErrorBadParameter;
600            goto EXIT;
601        }
602
603        pComponent =(OMX_COMPONENTTYPE *)(*pHandle);
604        pCompPrivateStruct = malloc (sizeof (OMX_PARAM_PORTDEFINITIONTYPE));
605        if(NULL == pCompPrivateStruct) {
606            printf("%d :: App: Malloc Failed\n",__LINE__);
607            goto EXIT;
608        }
609        /* set playback stream mute/unmute */
610        pCompPrivateStructMute = malloc (sizeof(OMX_AUDIO_CONFIG_MUTETYPE));
611        if(pCompPrivateStructMute == NULL) {
612            printf("%d :: App: Malloc Failed\n",__LINE__);
613            goto EXIT;
614        }
615        pCompPrivateStructVolume = malloc (sizeof(OMX_AUDIO_CONFIG_VOLUMETYPE));
616        if(pCompPrivateStructVolume == NULL) {
617            printf("%d :: App: Malloc Failed\n",__LINE__);
618            goto EXIT;
619        }
620
621        pCompPrivateStruct->nSize = sizeof (OMX_PARAM_PORTDEFINITIONTYPE);
622        pAppPrivate = malloc(sizeof(TI_OMX_DSP_DEFINITION));
623        if (NULL == pAppPrivate) {
624            printf("%d :: App: Error: Malloc Failed\n",__LINE__);
625            goto EXIT;
626        }
627        pAppPrivate->dasfMode = gDasfMode;
628        pAppPrivate->packingType = packingType;
629        /* Send input port config */
630        pCompPrivateStruct->eDir = OMX_DirInput;
631        pCompPrivateStruct->nBufferCountActual = nIpBuffs;
632        pCompPrivateStruct->nBufferSize = nIpBufSize;
633        pCompPrivateStruct->format.audio.eEncoding = OMX_AUDIO_CodingG726;
634        pCompPrivateStruct->bEnabled = OMX_TRUE;
635        pCompPrivateStruct->bPopulated = OMX_FALSE;
636        pCompPrivateStruct->nPortIndex = OMX_DirInput;
637#ifdef OMX_GETTIME
638        GT_START();
639        error = OMX_SetParameter(*pHandle,OMX_IndexParamPortDefinition, pCompPrivateStruct);
640        GT_END("Set Parameter Test-SetParameter");
641#else
642        error = OMX_SetParameter(*pHandle,OMX_IndexParamPortDefinition, pCompPrivateStruct);
643#endif
644
645        if (error != OMX_ErrorNone)
646        {
647            error = OMX_ErrorBadParameter;
648            printf ("%d :: OMX_ErrorBadParameter\n",__LINE__);
649            goto EXIT;
650        }
651
652        /* Send output port config */
653        pCompPrivateStruct->eDir = OMX_DirOutput;
654        pCompPrivateStruct->nBufferCountActual = nOpBuffs;
655        pCompPrivateStruct->nBufferSize = nOpBufSize;
656        pCompPrivateStruct->format.audio.eEncoding = OMX_AUDIO_CodingPCM;
657        pCompPrivateStruct->bEnabled = OMX_TRUE;
658        pCompPrivateStruct->bPopulated = OMX_FALSE;
659        pCompPrivateStruct->nPortIndex = OMX_DirOutput;
660
661        if(gDasfMode == 1) {
662            pCompPrivateStruct->bPopulated = OMX_TRUE;
663        }
664
665#ifdef OMX_GETTIME
666        GT_START();
667        error = OMX_SetParameter(*pHandle, OMX_IndexParamPortDefinition, pCompPrivateStruct);
668        GT_END("Set Parameter Test-SetParameter");
669#else
670        error = OMX_SetParameter(*pHandle, OMX_IndexParamPortDefinition, pCompPrivateStruct);
671#endif
672
673        if (error != OMX_ErrorNone)
674        {
675            error = OMX_ErrorBadParameter;
676            printf ("%d :: OMX_ErrorBadParameter\n",__LINE__);
677            goto EXIT;
678        }
679
680        error = OMX_GetExtensionIndex(*pHandle, "OMX.TI.index.config.g726headerinfo",&index);
681        if (error != OMX_ErrorNone) {
682            printf("Error getting extension index\n");
683            goto EXIT;
684        }
685
686
687#ifdef DSP_RENDERING_ON
688        cmd_data.hComponent = *pHandle;
689        cmd_data.AM_Cmd = AM_CommandIsOutputStreamAvailable;
690
691        /* for decoder, using AM_CommandIsInputStreamAvailable */
692        cmd_data.param1 = 0;
693        if((write(fdwrite, &cmd_data, sizeof(cmd_data)))<0) {
694            printf("%d ::G726DecTest.c ::[G726 Dec Component] - send command to audio manager\n", __LINE__);
695        }
696        if((read(fdread, &cmd_data, sizeof(cmd_data)))<0) {
697            printf("%d ::G726DecTest.c ::[G726 Dec Component] - failure to get data from the audio manager\n", __LINE__);
698            goto EXIT;
699        }
700        pAppPrivate->streamId = cmd_data.streamID;
701#endif
702
703        OMX_SetConfig(*pHandle, index, pAppPrivate);
704        if(error != OMX_ErrorNone) {
705            error = OMX_ErrorBadParameter;
706            APP_DPRINT("%d :: Error from OMX_SetConfig() function\n",__LINE__);
707            goto EXIT;
708        }
709        APP_DPRINT("sending component to Idle state from loaded state\n");
710
711#ifdef OMX_GETTIME
712        GT_START();
713#endif
714
715        error = OMX_SendCommand(*pHandle, OMX_CommandStateSet, OMX_StateIdle, NULL);
716        if(error != OMX_ErrorNone) {
717            APP_DPRINT ("Error from SendCommand-Idle(Init) State function - error = %d\n",error);
718            goto EXIT;
719        }
720        int i = 0;
721
722#ifndef USE_BUFFER
723        for(i=0; i<nIpBuffs; i++) {
724            APP_DPRINT("%d :: About to call OMX_AllocateBuffer On Input\n",__LINE__);
725            error = OMX_AllocateBuffer(*pHandle, &pInputBufferHeader[i], 0, NULL, nIpBufSize);
726            APP_DPRINT("%d :: called OMX_AllocateBuffer\n",__LINE__);
727            if(error != OMX_ErrorNone) {
728                APP_DPRINT("%d :: Error returned by OMX_AllocateBuffer()\n",__LINE__);
729                goto EXIT;
730            }
731        }
732
733        if (pAppPrivate->dasfMode == 0) {
734            for(i=0; i<nOpBuffs; i++) {
735                error = OMX_AllocateBuffer(*pHandle,&pOutputBufferHeader[i],1,NULL,nOpBufSize);
736                if(error != OMX_ErrorNone) {
737                    APP_DPRINT("%d :: Error returned by OMX_AllocateBuffer()\n",__LINE__);
738                    goto EXIT;
739                }
740            }
741        }
742
743#else
744
745        OMX_U8* pInputBuffer[MAX_NUM_OF_BUFS] = {NULL};
746        OMX_U8* pOutputBuffer[MAX_NUM_OF_BUFS] = {NULL};
747        for(i=0; i<nIpBuffs; i++) {
748            pInputBuffer[i] = (OMX_U8*)malloc(nIpBufSize);
749            pInputBuffer[i] = pInputBuffer[i] + 128;
750            APP_DPRINT("%d :: About to call OMX_UseBuffer On Input\n",__LINE__);
751            error = OMX_UseBuffer(*pHandle,&pInputBufferHeader[i],0,NULL,nIpBufSize,pInputBuffer[i]);
752            if(error != OMX_ErrorNone) {
753                APP_DPRINT("%d :: Error returned by OMX_UseBuffer()\n",__LINE__);
754                goto EXIT;
755            }
756        }
757
758        if (pAppPrivate->dasfMode == 0) {
759            for(i=0; i<nOpBuffs; i++) {
760                pOutputBuffer[i] = malloc (nOpBufSize + 256);
761                pOutputBuffer[i] = pOutputBuffer[i] + 128;
762                /* allocate output buffer */
763                APP_DPRINT("%d :: About to call OMX_UseBuffer On Output\n",__LINE__);
764                error = OMX_UseBuffer(*pHandle,&pOutputBufferHeader[i],1,NULL,nOpBufSize,pOutputBuffer[i]);
765                if(error != OMX_ErrorNone) {
766                    APP_DPRINT("%d :: Error returned by OMX_UseBuffer()\n",__LINE__);
767                    goto EXIT;
768                }
769                pOutputBufferHeader[i]->nFilledLen = 0;
770            }
771        }
772#endif
773
774        /* g726 params for input was here */
775
776        /* Send  G726 config for output */
777        pPcmParam = malloc (sizeof(OMX_AUDIO_PARAM_PCMMODETYPE));
778        pPcmParam->nSize                    = sizeof(OMX_AUDIO_PARAM_PCMMODETYPE);
779        pPcmParam->nVersion.s.nVersionMajor = 1;
780        pPcmParam->nVersion.s.nVersionMinor = 1;
781        pPcmParam->nPortIndex               = OMX_DirOutput;
782        pPcmParam->nChannels                = 1; /* mono */
783        pPcmParam->nBitPerSample            = 16;
784        pPcmParam->nSamplingRate            = 8000;
785        pPcmParam->eNumData                 = OMX_NumericalDataUnsigned;
786        pPcmParam->eEndian                  = OMX_EndianLittle;
787        pPcmParam->bInterleaved             = OMX_FALSE;
788        pPcmParam->ePCMMode                 = OMX_AUDIO_PCMModeLinear;
789
790#ifdef OMX_GETTIME
791        GT_START();
792        error = OMX_SetParameter (*pHandle, OMX_IndexParamAudioPcm, pPcmParam);
793        GT_END("Set Parameter Test-SetParameter");
794#else
795        error = OMX_SetParameter (*pHandle, OMX_IndexParamAudioPcm, pPcmParam);
796#endif
797
798        if (error != OMX_ErrorNone) {
799            error = OMX_ErrorBadParameter;
800            goto EXIT;
801        }
802
803        /* default setting for Mute/Unmute */
804        pCompPrivateStructMute->nSize                    = sizeof (OMX_AUDIO_CONFIG_MUTETYPE);
805        pCompPrivateStructMute->nVersion.s.nVersionMajor = 0x1;
806        pCompPrivateStructMute->nVersion.s.nVersionMinor = 0x1;
807        pCompPrivateStructMute->nPortIndex               = OMX_DirInput;
808        pCompPrivateStructMute->bMute                    = OMX_FALSE;
809
810        /* default setting for volume */
811        pCompPrivateStructVolume->nSize                    = sizeof(OMX_AUDIO_CONFIG_VOLUMETYPE);
812        pCompPrivateStructVolume->nVersion.s.nVersionMajor = 0x1;
813        pCompPrivateStructVolume->nVersion.s.nVersionMinor = 0x1;
814        pCompPrivateStructVolume->nPortIndex               = OMX_DirInput;
815        pCompPrivateStructVolume->bLinear                  = OMX_FALSE;
816        pCompPrivateStructVolume->sVolume.nValue           = 50;  /* actual volume */
817        pCompPrivateStructVolume->sVolume.nMin             = 0;   /* min volume */
818        pCompPrivateStructVolume->sVolume.nMax             = 100; /* max volume */
819
820        if(pAppPrivate->dasfMode == 1) {
821            APP_DPRINT("%d :: G726 DECODER RUNNING UNDER DASF MODE\n",__LINE__);
822        } else if(pAppPrivate->dasfMode == 0) {
823            APP_DPRINT("%d :: G726 DECODER RUNNING UNDER FILE MODE\n",__LINE__);
824        } else {
825            printf("%d :: IMPROPER SETTING OF DASF/FILE MODE \n",__LINE__);
826        }
827
828        if (gDasfMode) {
829            APP_DPRINT("***************StreamId=%d******************\n", (int)pAppPrivate->streamId);
830#ifdef RTM_PATH
831            dataPath = DATAPATH_APPLICATION_RTMIXER;
832#endif
833#ifdef ETEEDN_PATH
834            dataPath = DATAPATH_APPLICATION;
835#endif
836            error = OMX_GetExtensionIndex(*pHandle, "OMX.TI.index.config.g726dec.datapath",&index);
837            if (error != OMX_ErrorNone) {
838                printf("Error getting extension index\n");
839                goto EXIT;
840            }
841            error = OMX_SetConfig (*pHandle, index, &dataPath);
842            if(error != OMX_ErrorNone) {
843                error = OMX_ErrorBadParameter;
844                APP_DPRINT("%d :: G726DecTest.c :: Error from OMX_SetConfig() function\n",__LINE__);
845                goto EXIT;
846            }
847        }
848
849        APP_DPRINT("%d :: App :: About to call WaitForState to change to Idle\n",__LINE__);
850        error = WaitForState(pHandle, OMX_StateIdle);
851#ifdef OMX_GETTIME
852        GT_END("Call to SendCommand <OMX_StateIdle> After Init & Clearing Buffers");
853#endif
854        APP_DPRINT("%d :: App :: state changed to Idle\n",__LINE__);
855        if(error != OMX_ErrorNone) {
856            APP_DPRINT( "Error:  hG726Decoder->WaitForState reports an error %X\n", error);
857            goto EXIT;
858        }
859
860        /*****************************************************
861                    INNER LOOP STARTS
862        *****************************************************/
863        for(i = 0; i < testcnt; i++) {
864            fIn = fopen(argv[1], "r");
865            if(fIn == NULL) {
866                fprintf(stderr, "Error:  failed to open the file %s for readonly access\n", argv[1]);
867                goto EXIT;
868            }
869
870            if(gDasfMode == 0) {
871                fOut = fopen(fname, "w");
872                if(fOut == NULL) {
873                    fprintf(stderr, "Error:  failed to create the output file \n");
874                    goto EXIT;
875                }
876                APP_DPRINT("%d :: Op File has created\n",__LINE__);
877            }
878
879            if (tcID == 5) {
880                printf("*********************************************************\n");
881                printf ("App: Decoding for %d time\n",i);
882                printf("*********************************************************\n");
883            }
884#ifdef OMX_GETTIME
885            GT_START();
886#endif
887            error = OMX_SendCommand(*pHandle, OMX_CommandStateSet, OMX_StateExecuting, NULL);
888            if(error != OMX_ErrorNone) {
889                APP_DPRINT ("Error from SendCommand-Executing State function\n");
890                goto EXIT;
891            }
892
893            APP_DPRINT("%d :: App :: About to call WaitForState to change to Executing\n",__LINE__);
894            error = WaitForState(pHandle, OMX_StateExecuting);
895            gState = OMX_StateExecuting;
896#ifdef OMX_GETTIME
897            GT_END("Call to SendCommand <OMX_StateExecuting>");
898#endif
899            APP_DPRINT("%d :: App :: state changed to Executing\n",__LINE__);
900            if(error != OMX_ErrorNone) {
901                APP_DPRINT( "Error:  WaitForState reports an error %X\n", error);
902                goto EXIT;
903            }
904
905            for (k=0; k < nIpBuffs; k++) {
906#ifdef OMX_GETTIME
907                if (k==0)
908                {
909                    GT_FlagE=1;  /* 1 = First Buffer,  0 = Not First Buffer  */
910                    GT_START(); /* Empty Bufffer */
911                }
912#endif
913                error = send_input_buffer (*pHandle, pInputBufferHeader[k], fIn);
914                if (error != OMX_ErrorNone){
915                    printf("error from send input buffer!\n");
916                    goto EXIT;
917                }
918            }
919
920            if (gDasfMode == 0) {
921                for (k=0; k < nOpBuffs; k++) {
922#ifdef OMX_GETTIME
923                    if (k==0)
924                    {
925                        GT_FlagF=1;  /* 1 = First Buffer,  0 = Not First Buffer  */
926                        GT_START(); /* Fill Buffer */
927                    }
928#endif
929                    OMX_FillThisBuffer(*pHandle, pOutputBufferHeader[k]);
930                }
931            }
932
933            while((error == OMX_ErrorNone) && (gState != OMX_StateIdle)) {
934                FD_ZERO(&rfds);
935                FD_SET(IpBuf_Pipe[0], &rfds);
936                FD_SET(OpBuf_Pipe[0], &rfds);
937                tv.tv_sec = 1;
938                tv.tv_usec = 0;
939                frmCount++;
940
941                retval = select(fdmax+1, &rfds, NULL, NULL, &tv);
942                if(retval == -1) {
943                    perror("select()");
944                    APP_DPRINT ( " : Error \n");
945                    break;
946                }
947
948                if(retval == 0) {
949                    APP_DPRINT ("%d :: Basic App Timeout !!!!!!!!!!! \n",__LINE__);
950                }
951
952                switch (tcID) {
953                case 0:
954                case 1:
955                case 5:
956                case 6:
957                    if(FD_ISSET(IpBuf_Pipe[0], &rfds)) {
958                        OMX_BUFFERHEADERTYPE* pBuffer = NULL;
959                        read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
960                        error = send_input_buffer (*pHandle, pBuffer, fIn);
961                        if (error != OMX_ErrorNone) {
962                            printf("error from send buffer!\n");
963                            goto EXIT;
964                        }
965                        frmCnt++;
966                    }
967                    break;
968                case 2:
969                case 4:
970                    if(FD_ISSET(IpBuf_Pipe[0], &rfds)) {
971                        OMX_BUFFERHEADERTYPE* pBuffer = NULL;
972                        read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
973                        if(frmCnt == 40) {
974                            APP_DPRINT("Shutting down ---------- \n");
975#ifdef OMX_GETTIME
976                            GT_START();
977#endif
978                            error = OMX_SendCommand(*pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL);
979                            if(error != OMX_ErrorNone) {
980                                fprintf (stderr,"Error from SendCommand-Idle(Stop) State function\n");
981                                goto EXIT;
982                            }
983                            /*pBuffer->nFilledLen = 0;
984                              pComponent->EmptyThisBuffer(*pHandle, pBuffer);*/
985                        } else {
986                            error = send_input_buffer (*pHandle, pBuffer, fIn);
987                            if (error != OMX_ErrorNone) {
988                                printf ("Error While reading input pipe\n");
989                                goto EXIT;
990                            }
991                        }
992                        if(frmCnt == 40 && tcID == 4) {
993                            APP_STATEPRINT ("*********** Waiting for state to change to Idle ************\n\n");
994                            error = WaitForState(pHandle, OMX_StateIdle);
995#ifdef OMX_GETTIME
996                            GT_END("Call to SendCommand <OMX_StateIdle>");
997#endif
998                            if(error != OMX_ErrorNone) {
999                                fprintf(stderr, "Error:  WaitForState reports an error %X\n", error);
1000                                goto EXIT;
1001                            }
1002                            APP_STATEPRINT("*********** State Changed to Idle ************\n\n");
1003
1004                            printf("Component Has Stopped here and waiting for %d seconds before it plays further\n",SLEEP_TIME);
1005                            sleep(SLEEP_TIME);
1006
1007                            APP_STATEPRINT("*************** Execute command to Component *******************\n");
1008#ifdef OMX_GETTIME
1009                            GT_START();
1010#endif
1011                            error = OMX_SendCommand(*pHandle, OMX_CommandStateSet,OMX_StateExecuting, NULL);
1012                            if(error != OMX_ErrorNone) {
1013                                fprintf (stderr,"Error from SendCommand-Executing State function\n");
1014                                goto EXIT;
1015                            }
1016
1017                            APP_STATEPRINT("*********** Waiting for state to change to Executing ************\n\n");
1018                            error = WaitForState(pHandle, OMX_StateExecuting);
1019#ifdef OMX_GETTIME
1020                            GT_END("Call to SendCommand <OMX_StateExecuting>");
1021#endif
1022                            if(error != OMX_ErrorNone) {
1023                                fprintf(stderr, "Error:  WaitForState reports an error %X\n", error);
1024                                goto EXIT;
1025                            }
1026                            gState = OMX_StateExecuting;
1027                            APP_STATEPRINT("*********** State Changed to Executing ************\n\n");
1028
1029                            if (gDasfMode == 0) {
1030                                /*rewind input and output files*/
1031                                fseek(fIn, 0L, SEEK_SET);
1032                                fseek(fOut, 0L, SEEK_SET);
1033                            }
1034
1035                            for (k=0; k < nIpBuffs; k++) {
1036                                /* memset(pInputBufferHeader[k],0,nIpBufSize); */
1037                                error = send_input_buffer (*pHandle, pInputBufferHeader[k], fIn);
1038                            }
1039                        }
1040                        frmCnt++;
1041                    }
1042                    break;
1043                case 3:
1044                    if(frmCount == 30 || frmCount == 60) {
1045                        APP_STATEPRINT("\n\n*************** Pause command to Component *******************\n");
1046#ifdef OMX_GETTIME
1047                        GT_START();
1048#endif
1049                        error = OMX_SendCommand(*pHandle, OMX_CommandStateSet, OMX_StatePause, NULL);
1050                        if(error != OMX_ErrorNone) {
1051                            fprintf (stderr,"Error from SendCommand-Pasue State function\n");
1052                            goto EXIT;
1053                        }
1054                        APP_STATEPRINT("*********** Waiting for state to change to Pause ************\n");
1055
1056                        error = WaitForState(pHandle, OMX_StatePause);
1057#ifdef OMX_GETTIME
1058                        GT_END("Call to SendCommand <OMX_StatePause>");
1059#endif
1060                        if(error != OMX_ErrorNone) {
1061                            fprintf(stderr, "Error:  WaitForState reports an error %X\n", error);
1062                            goto EXIT;
1063                        }
1064                        APP_STATEPRINT("*********** State Changed to Pause ************\n\n");
1065
1066                        printf("Sleeping for %d secs....\n\n",SLEEP_TIME);
1067                        sleep(SLEEP_TIME);
1068
1069                        APP_STATEPRINT("*************** Resume command to Component *******************\n");
1070#ifdef OMX_GETTIME
1071                        GT_START();
1072#endif
1073                        error = OMX_SendCommand(*pHandle, OMX_CommandStateSet,OMX_StateExecuting, NULL);
1074                        if(error != OMX_ErrorNone) {
1075                            fprintf (stderr,"Error from SendCommand-Executing State function\n");
1076                            goto EXIT;
1077                        }
1078
1079                        APP_STATEPRINT("******** Waiting for state to change to Resume ************\n");
1080
1081                        error = WaitForState(pHandle, OMX_StateExecuting);
1082#ifdef OMX_GETTIME
1083                        GT_END("Call to SendCommand <OMX_StateExecuting>");
1084#endif
1085                        if(error != OMX_ErrorNone) {
1086                            fprintf(stderr, "Error:  WaitForState reports an error %X\n", error);
1087                            goto EXIT;
1088                        }
1089                        APP_STATEPRINT("*********** State Changed to Resume ************\n\n");
1090                    }
1091
1092                    if(FD_ISSET(IpBuf_Pipe[0], &rfds)) {
1093                        OMX_BUFFERHEADERTYPE* pBuffer = NULL;
1094                        read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1095                        error = send_input_buffer (*pHandle, pBuffer, fIn);
1096                        if (error != OMX_ErrorNone) {
1097                            printf ("Error While reading input pipe\n");
1098                            goto EXIT;
1099                        }
1100                        frmCnt++;
1101                    }
1102                    break;
1103                case 7:
1104                    /* test mute/unmute playback stream */
1105                    if(FD_ISSET(IpBuf_Pipe[0], &rfds)) {
1106                        OMX_BUFFERHEADERTYPE* pBuffer = NULL;
1107                        read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1108                        error = send_input_buffer (*pHandle, pBuffer, fIn);
1109                        if (error != OMX_ErrorNone) {
1110                            goto EXIT;
1111                        }
1112                        frmCnt++;
1113                    }
1114
1115                    if(frmCnt == 3) {
1116                        printf("************Mute the playback stream*****************\n");
1117                        pCompPrivateStructMute->bMute = OMX_TRUE;
1118                        error = OMX_SetConfig(*pHandle, OMX_IndexConfigAudioMute, pCompPrivateStructMute);
1119                        if (error != OMX_ErrorNone) {
1120                            error = OMX_ErrorBadParameter;
1121                            goto EXIT;
1122                        }
1123                    }
1124
1125                    if(frmCnt == 6) {
1126                        printf("************Unmute the playback stream*****************\n");
1127                        pCompPrivateStructMute->bMute = OMX_FALSE;
1128                        error = OMX_SetConfig(*pHandle, OMX_IndexConfigAudioMute, pCompPrivateStructMute);
1129                        if (error != OMX_ErrorNone) {
1130                            error = OMX_ErrorBadParameter;
1131                            goto EXIT;
1132                        }
1133                    }
1134                    break;
1135                case 8:
1136                    /* test set volume for playback stream */
1137                    if(FD_ISSET(IpBuf_Pipe[0], &rfds)) {
1138                        OMX_BUFFERHEADERTYPE* pBuffer = NULL;
1139                        read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1140                        error = send_input_buffer (*pHandle, pBuffer, fIn);
1141                        if (error != OMX_ErrorNone) {
1142                            goto EXIT;
1143                        }
1144                        frmCnt++;
1145                    }
1146
1147                    if(frmCnt == 3) {
1148                        printf("************Set stream volume to high*****************\n");
1149                        pCompPrivateStructVolume->sVolume.nValue = 0x8000;
1150                        error = OMX_SetConfig(*pHandle, OMX_IndexConfigAudioVolume, pCompPrivateStructVolume);
1151                        if (error != OMX_ErrorNone) {
1152                            error = OMX_ErrorBadParameter;
1153                            goto EXIT;
1154                        }
1155                    }
1156
1157                    if(frmCnt == 6) {
1158                        printf("************Set stream volume to low*****************\n");
1159                        pCompPrivateStructVolume->sVolume.nValue = 0x1000;
1160                        error = OMX_SetConfig(*pHandle, OMX_IndexConfigAudioVolume, pCompPrivateStructVolume);
1161                        if (error != OMX_ErrorNone) {
1162                            error = OMX_ErrorBadParameter;
1163                            goto EXIT;
1164                        }
1165                    }
1166                    break;
1167                default:
1168                    APP_DPRINT("%d :: ### Running Simple DEFAULT Case Here ###\n",__LINE__);
1169                }
1170
1171                if( FD_ISSET(OpBuf_Pipe[0], &rfds) ) {
1172                    OMX_BUFFERHEADERTYPE* pBuf = NULL;
1173                    read(OpBuf_Pipe[0], &pBuf, sizeof(pBuf));
1174                    if(pBuf->nFilledLen == 0){
1175                        APP_DPRINT("%d :: APP: output buffer received, filled length = %d, totalfilled = %d\n",__LINE__,(int)pBuf->nFilledLen,totalFilled);
1176                    }else {
1177                        APP_DPRINT("%d :: APP: output buffer received, filled length = %d, totalfilled = %d\n",__LINE__,(int)pBuf->nFilledLen,totalFilled);
1178                        fwrite(pBuf->pBuffer, 1, pBuf->nFilledLen, fOut);
1179                        if (tcID == 0){
1180                            APP_DPRINT("-----------------------------------------\n");
1181                            APP_DPRINT("Output time stamp = %d\n", (int)pBuf->nTimeStamp);
1182                            APP_DPRINT("Output tick count = %ld\n", pBuf->nTickCount);
1183                            APP_DPRINT("-----------------------------------------\n");
1184                        }
1185
1186                    }
1187                    totalFilled ++;
1188                    fflush(fOut);
1189                    OMX_FillThisBuffer(*pHandle, pBuf);
1190
1191                }
1192                if(playcompleted){
1193                    printf("play completed, stopping component\n");
1194
1195#ifdef OMX_GETTIME
1196                    GT_START();
1197#endif
1198                    error = OMX_SendCommand(*pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL);
1199                    if(error != OMX_ErrorNone) {
1200                        fprintf (stderr,"Error from SendCommand-Idle(Stop) State function\n");
1201                        goto EXIT;
1202                    }
1203                    error = WaitForState(pHandle, OMX_StateIdle);
1204#ifdef OMX_GETTIME
1205                    GT_END("Call to SendCommand <OMX_StateIdle>");
1206#endif
1207                    if(error != OMX_ErrorNone) {
1208                        fprintf(stderr, "Error:  hG726Decoder->WaitForState reports an error %X\n", error);
1209                        goto EXIT;
1210                    }
1211                    playcompleted = 0;
1212
1213                }
1214            } /* While Loop Ending Here */
1215
1216            if(0 == gDasfMode) {
1217                fclose(fOut);
1218            }
1219
1220            fclose(fIn);
1221            if(i != (testcnt-1)) {
1222                if((tcID == 5) || (tcID == 2)) {
1223                    printf("%d :: sleeping here for %d secs\n",__LINE__,SLEEP_TIME);
1224                    sleep (SLEEP_TIME);
1225                } else {
1226                    sleep (0);
1227                }
1228            }
1229
1230        }
1231
1232        /*******************************************************
1233                END INNER LOOP
1234        *******************************************************/
1235
1236#ifdef DSP_RENDERING_ON
1237        cmd_data.hComponent = *pHandle;
1238        cmd_data.AM_Cmd = AM_Exit;
1239        if((write(fdwrite, &cmd_data, sizeof(cmd_data)))<0)
1240            printf("%d :: [G726 Dec Component] - send command to audio manager\n",__LINE__);
1241        close(fdwrite);
1242        close(fdread);
1243#endif
1244
1245        for(i=0; i<nIpBuffs; i++) {
1246            APP_DPRINT("%d :: App: Freeing %p IP BufHeader\n",__LINE__,pInputBufferHeader[i]);
1247            error = OMX_FreeBuffer(*pHandle,OMX_DirInput,pInputBufferHeader[i]);
1248            if((error != OMX_ErrorNone)) {
1249                APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
1250                goto EXIT;
1251            }
1252        }
1253
1254        if(pAppPrivate->dasfMode == 0) {
1255            for(i=0; i<nOpBuffs; i++) {
1256                APP_DPRINT("%d :: App: Freeing %p OP BufHeader\n",__LINE__,pOutputBufferHeader[i]);
1257                error = OMX_FreeBuffer(*pHandle,OMX_DirOutput,pOutputBufferHeader[i]);
1258                if((error != OMX_ErrorNone)) {
1259                    APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
1260                    goto EXIT;
1261                }
1262            }
1263        }
1264
1265        APP_DPRINT ("Sending the StateLoaded Command\n");
1266
1267#ifdef OMX_GETTIME
1268        GT_START();
1269#endif
1270
1271        error = OMX_SendCommand(*pHandle,OMX_CommandStateSet, OMX_StateLoaded, NULL);
1272        error = WaitForState(pHandle, OMX_StateLoaded);
1273
1274#ifdef OMX_GETTIME
1275        GT_END("Call to SendCommand <OMX_StateLoaded>");
1276#endif
1277
1278        if(error != OMX_ErrorNone) {
1279            APP_DPRINT ("%d:: Error from SendCommand-Idle State function\n",__LINE__);
1280            goto EXIT;
1281        }
1282
1283        error = TIOMX_FreeHandle(*pHandle);
1284        if( (error != OMX_ErrorNone)) {
1285            APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
1286            goto EXIT;
1287        }
1288        APP_DPRINT ("%d:: Free Handle returned Successfully \n\n\n\n",__LINE__);
1289        if (pHandle) {
1290            free(pHandle);
1291            pHandle = NULL;
1292        }
1293
1294        if(pCompPrivateStruct != NULL){
1295            free(pCompPrivateStruct);
1296            pCompPrivateStruct = NULL;
1297        }
1298        if(pG726Param != NULL){
1299            free(pG726Param);
1300            pG726Param = NULL;
1301        }
1302        if(pPcmParam != NULL){
1303            free(pPcmParam);
1304            pPcmParam = NULL;
1305        }
1306        if(pCompPrivateStructMute != NULL){
1307            free(pCompPrivateStructMute);
1308            pCompPrivateStructMute = NULL;
1309        }
1310        if(pCompPrivateStructVolume != NULL){
1311            free(pCompPrivateStructVolume);
1312            pCompPrivateStructVolume = NULL;
1313        }
1314        if(pAppPrivate != NULL){
1315            free(pAppPrivate);
1316            pAppPrivate = NULL;
1317        }
1318
1319        close(IpBuf_Pipe[0]);
1320        close(IpBuf_Pipe[1]);
1321        close(OpBuf_Pipe[0]);
1322        close(OpBuf_Pipe[1]);
1323    }
1324    /**************************************************
1325            END OUTER LOOP
1326    **************************************************/
1327    if (gDasfMode == 0) {
1328        printf("**********************************************************\n");
1329        printf("NOTE: An output file has been created in file system\n");
1330        printf("**********************************************************\n");
1331    }
1332 EXIT:
1333
1334#ifdef MTRACE
1335    muntrace();
1336#endif
1337
1338#ifdef OMX_GETTIME
1339    GT_END("G726_DEC test <End>");
1340    OMX_ListDestroy(pListHead);
1341#endif
1342    return error;
1343}
1344
1345
1346/* ================================================================================= * */
1347/**
1348 * @fn send_input_buffer() Sends the input buffer to the component.
1349 *
1350 * @param pHandle This is component handle allocated by the OMX core.
1351 *
1352 * @param pBuffer This is the buffer pointer.
1353 *
1354 * @fIn This is input file handle.
1355 *
1356 * @pre          None
1357 *
1358 * @post         None
1359 *
1360 *  @return      Appropriate OMX error.
1361 *
1362 *  @see         None
1363 */
1364/* ================================================================================ * */
1365OMX_ERRORTYPE send_input_buffer(OMX_HANDLETYPE pHandle, OMX_BUFFERHEADERTYPE* pBuffer, FILE *fIn)
1366{
1367    OMX_ERRORTYPE error = OMX_ErrorNone;
1368    int nRead = 0;
1369
1370    nRead = fill_data (pBuffer, fIn);
1371
1372    if (tcID == 0){
1373        pBuffer->nTimeStamp = (OMX_S64) rand() % 2;
1374        pBuffer->nTickCount = rand() % 70;
1375        APP_DPRINT("Input time stamp = %d\n", (int)pBuffer->nTimeStamp);
1376        APP_DPRINT("Input tick count = %ld\n", pBuffer->nTickCount);
1377    }
1378    if(nRead < nIpBufSize)
1379    {
1380        pBuffer->nFlags = OMX_BUFFERFLAG_EOS;
1381    }
1382    else {
1383        pBuffer->nFlags = 0;
1384    }
1385
1386    OMX_EmptyThisBuffer(pHandle, pBuffer);
1387
1388    return error;
1389
1390}
1391
1392/* ================================================================================= * */
1393/**
1394 * @fn fill_data() Reads the data from the input file.
1395 *
1396 * @param pBuffer This is the buffer pointer.
1397 *
1398 * @fIn This is input file handle.
1399 *
1400 * @pre          None
1401 *
1402 * @post         None
1403 *
1404 *  @return      Number of bytes that have been read.
1405 *
1406 *  @see         None
1407 */
1408/* ================================================================================ * */
1409int fill_data (OMX_BUFFERHEADERTYPE *pBuf,FILE *fIn)
1410{
1411    int nRead = 0;
1412    static int totalRead = 0;
1413    static int fileHdrReadFlag = 0;
1414    static int ccnt = 1;
1415
1416    playcompleted = 0;
1417    if (!fileHdrReadFlag) {
1418        fileHdrReadFlag = 1;
1419    }
1420    nRead = fread(pBuf->pBuffer, 1, pBuf->nAllocLen , fIn);
1421    pBuf->nFlags = 0;
1422    if (nRead != 0) {
1423        totalRead += nRead;
1424        pBuf->nFilledLen = nRead;
1425        pBuf->nAllocLen = nIpBufSize;
1426        ccnt++;
1427
1428        APP_DPRINT("\n*****************************************************\n");
1429        APP_DPRINT ("%d :: App:: pBuf->pBuffer = %p pBuf->nAllocLen = * %ld, nRead = %d, totalread = %d\n",
1430                    __LINE__, pBuf->pBuffer, pBuf->nAllocLen, nRead, totalRead);
1431        APP_DPRINT("\n*****************************************************\n");
1432
1433        if (nRead < pBuf->nAllocLen){
1434            pBuf->nFlags = OMX_BUFFERFLAG_EOS;
1435            playcompleted = 1;
1436            printf("End of file on partially filled buffer\n");
1437        }
1438    }
1439    else{
1440        pBuf->nFlags = OMX_BUFFERFLAG_EOS;
1441        pBuf->nFilledLen = 0;
1442        playcompleted = 1;
1443        printf("End of file on a empty buffer \n");
1444    }
1445
1446    return nRead;
1447}
1448