G722DecTest.c revision b44cdb1b44b144d09e8ec950d1e8e4c280064056
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_G722DecTest.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\g722_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/*#define APP_DEBUG **/
41/*#undef APP_DEBUG **/
42/*undef OMX_GETTIME  */
43
44/*#define G722DEC_DEBUG*/
45/*#define APP_DEBUG*/
46/*#define APP_STATEDETAILS*/
47/*#define WAITFORRESOURCES*/
48#undef USE_BUFFER
49/****************************************************************
50 *  INCLUDE FILES
51 ****************************************************************/
52/* ----- system and platform files ----------------------------*/
53#include <unistd.h>
54#include <stdlib.h>
55#include <sys/ioctl.h>
56#include <sys/select.h>
57#include <string.h>
58#include <stdio.h>
59#include <fcntl.h>
60#include <errno.h>
61#include <signal.h>
62#include <sys/stat.h>
63#include <OMX_Index.h>
64#include <OMX_Types.h>
65#include <OMX_Core.h>
66#include <OMX_Audio.h>
67#include <TIDspOmx.h>
68#include <pthread.h>
69#include <linux/soundcard.h>
70typedef enum {FALSE, TRUE} boolean;
71#include <OMX_G722Dec_Utils.h>
72
73
74#ifdef OMX_GETTIME
75#include <OMX_Common_Utils.h>
76#include <OMX_GetTime.h>     /*Headers for Performance & measuremet    */
77#endif
78
79#ifdef APP_DEBUG
80#define APP_DPRINT(...)    fprintf(stderr,__VA_ARGS__)
81#else
82#define APP_DPRINT(...)     /*0j0 printf (__VA_ARGS__)*/
83#endif
84
85#ifdef APP_STATEDETAILS
86#define APP_STATEPRINT(...)    fprintf(stderr,__VA_ARGS__)
87#else
88#define APP_STATEPRINT(...)    /*0j0 printf (__VA_ARGS__)*/
89#endif
90
91/* Constants */
92#define APP_OUTPUT_FILE        "output" /*.pcm"*/
93#define SLEEP_TIME             2
94#define G722_APP_ID            100 /* Defines G722 Dec App ID, App must use this value */
95#define INVALID_SAMPLING_FREQ  51  /*Do not change; fixed for component!*/
96#define MAX_NUM_OF_BUFS        10  /*Do not change; fixed for component!*/
97#define EOS_MIN_SIZE           2
98#define FIFO1                  "/dev/fifo.1"
99#define FIFO2                  "/dev/fifo.2"
100#define STR_G722DECODER        "OMX.TI.G722.decode"
101
102#ifdef APP_DEBUG
103#define N_REPETITIONS 5
104#else
105#define N_REPETITIONS 20
106#endif
107
108/* undef OMX_GETTIME  */
109#ifdef OMX_GETTIME
110/* OMX_ERRORTYPE eError = OMX_ErrorNone;*/
111int GT_FlagE = 0;  /* Fill Buffer 1 = First Buffer,  0 = Not First Buffer  */
112int GT_FlagF = 0;  /*Empty Buffer  1 = First Buffer,  0 = Not First Buffer  */
113static OMX_NODE* pListHead = NULL;
114#endif
115
116/*typedef enum {FALSE, TRUE} boolean;*/
117
118/* Prototypes */
119boolean              validateArguments  (int, char *[], int *, char *, int *, int *, int *, int *, int *, int *);
120int                  maxint             (int a, int b);
121static OMX_ERRORTYPE WaitForState       (OMX_HANDLETYPE *,       OMX_STATETYPE);
122OMX_ERRORTYPE        EventHandler       (OMX_HANDLETYPE,         OMX_PTR,                OMX_EVENTTYPE, OMX_U32, OMX_U32, OMX_PTR);
123void                 FillBufferDone     (OMX_HANDLETYPE,         OMX_PTR,                OMX_BUFFERHEADERTYPE *);
124void                 EmptyBufferDone    (OMX_HANDLETYPE,         OMX_PTR,                OMX_BUFFERHEADERTYPE *);
125OMX_ERRORTYPE        send_input_buffer  (OMX_HANDLETYPE,         OMX_BUFFERHEADERTYPE *, FILE *);
126int                  validateArg4       (char *);
127int           getNumTestCase            (char *, char *);
128boolean       checkInputParameters      (int);
129boolean       validateSampRate          (int);
130boolean       omxSetInputPortParameter  (OMX_HANDLETYPE *, int, int);
131boolean       omxSetOutputPortParameter (OMX_HANDLETYPE *, int, int, int);
132boolean       g722SetInputPort          (OMX_HANDLETYPE *, int);
133boolean       g722SetOutputPort         (OMX_HANDLETYPE *);
134boolean       omxSetConfigMute          (OMX_HANDLETYPE *, OMX_BOOL);
135boolean       omxSetConfigVolume        (OMX_HANDLETYPE *, OMX_S32);
136OMX_ERRORTYPE omxUseBuffers             (OMX_HANDLETYPE *, int, int, int, OMX_BUFFERHEADERTYPE *[], int, int, OMX_BUFFERHEADERTYPE *[]);
137OMX_ERRORTYPE testCases                 (OMX_HANDLETYPE *, fd_set *,int, FILE *, FILE *, int *, int *, struct timeval *, int, int, OMX_BUFFERHEADERTYPE *[], int, OMX_BUFFERHEADERTYPE *[]);
138OMX_ERRORTYPE testCase_2_4              (OMX_HANDLETYPE *, int, FILE *, FILE *, int, OMX_BUFFERHEADERTYPE *[]);
139OMX_ERRORTYPE testCase_3                (OMX_HANDLETYPE *);
140
141OMX_ERRORTYPE sendInBuffFillOutBuff     (OMX_HANDLETYPE *, int, int, int, OMX_BUFFERHEADERTYPE *[],  FILE *, OMX_BUFFERHEADERTYPE *[]);
142OMX_ERRORTYPE omxFreeBuffers            (OMX_HANDLETYPE *pHandle, int nBuffs, OMX_BUFFERHEADERTYPE *pBufferHeader  [], char *sBuffTypeMsg);
143
144void          printTestCaseInfo         (int, char *);
145void          getString_OMX_State       (char *ptrString, OMX_STATETYPE state);
146
147/* Global variables */
148int sendlastbuffer   = 0;
149OMX_STATETYPE gState = OMX_StateExecuting;
150
151int IpBuf_Pipe[2] = {0};
152int OpBuf_Pipe[2] = {0};
153int Event_Pipe[2] = {0};
154
155int preempted = 0;
156
157/* ================================================================================= * */
158/**
159 * @fn main() This is the main function of application which gets called.
160 *
161 * @param argc This is the number of commandline arguments..
162 *
163 * @param argv[] This is an array of pointers to command line arguments..
164 *
165 * @pre          None
166 *
167 * @post         None
168 *
169 *  @return      An integer value.
170 *
171 *  @see         None
172 */
173/* ================================================================================ * */
174int main(int argc, char* argv[])
175{
176    OMX_CALLBACKTYPE              G722CaBa = {(void *)EventHandler,
177                                              (void *)EmptyBufferDone,
178                                              (void *)FillBufferDone
179    };
180    int                           nIpBuffs   = 1;
181    int                           nOpBuffs   = 1;
182    int                           nIpBufSize = 4096; /*default value */
183    int                           nOpBufSize = 320; /* default value */
184    int                           gDasfMode  = 0;
185    OMX_HANDLETYPE               *pHandle                  = NULL;
186    OMX_ERRORTYPE                 error                    = OMX_ErrorNone;
187    OMX_U32                       AppData                  = G722_APP_ID;
188    TI_OMX_DSP_DEFINITION         appPrivate;
189    OMX_INDEXTYPE                 index     = 0;
190    OMX_BUFFERHEADERTYPE         *pInputBufferHeader  [MAX_NUM_OF_BUFS] = {NULL};
191    OMX_BUFFERHEADERTYPE         *pOutputBufferHeader [MAX_NUM_OF_BUFS] = {NULL};
192    TI_OMX_DATAPATH               dataPath;
193    fd_set                        rfds;
194    static int                    totalFilled = 0;
195    struct timeval                tv;
196    int                           retval       = 0;
197    int                           frmCnt       = 1;
198    char                          fname [100]  = APP_OUTPUT_FILE;
199    FILE*                         fIn          = NULL;
200    FILE*                         fOut         = NULL;
201    int                           tcID         = 0;
202#ifdef DSP_RENDERING_ON
203    int                           g722decfdwrite = 0;
204    int                           g722decfdread  = 0;
205#endif
206
207#ifdef OMX_GETTIME
208    OMX_ListCreate(&pListHead);
209#endif
210    int iSampRate = 0;
211    boolean bFlag = validateArguments (argc, argv, &iSampRate, fname, &tcID, &gDasfMode, &nIpBuffs, &nIpBufSize, &nOpBuffs, &nOpBufSize);
212    if (bFlag == FALSE) {
213        printf ("<<<<<<<<< Argument validate fault >>>>>>>>>");
214        exit (1);
215    }
216    int nIdx = 0,
217        nJdx = 0;
218    int nCntTest1 = (tcID != 6)? 1: N_REPETITIONS;
219    int nCntTest  = (tcID != 5)? 1: N_REPETITIONS;
220#ifdef APP_DEBUG
221    char strState [20] = {""};
222#endif
223
224    error = TIOMX_Init();
225    if(error != OMX_ErrorNone) {
226        APP_DPRINT("%d :: Error returned by OMX_Init()\n",__LINE__);
227        exit (1);
228    }
229
230    for (nIdx = 0; nIdx < nCntTest1; nIdx++) {
231        pHandle = malloc(sizeof(OMX_HANDLETYPE));
232        if(pHandle == NULL){
233            printf("%d :: App: Malloc Failed\n",__LINE__);
234            exit (1);
235        }
236
237#ifdef DSP_RENDERING_ON
238        if((g722decfdwrite = open(FIFO1,O_WRONLY))<0) {
239            printf("[G722TEST] - failure to open WRITE pipe\n");
240            exit (1);
241        }
242        printf("[G722TEST] - opened WRITE pipe\n");
243
244        if((g722decfdread = open(FIFO2,O_RDONLY))<0) {
245            printf("[G722TEST] - failure to open READ pipe\n");
246            exit (1);
247        }
248        printf("[G722TEST] - opened READ pipe\n");
249
250
251        if((write(g722decfdwrite, &cmd_data, sizeof(cmd_data)))<0) {
252            printf("%d ::G722DecTest.c ::[G722 Dec Component] - send command to audio manager\n", __LINE__);
253        }
254        if((read(g722decfdread, &cmd_data, sizeof(cmd_data)))<0) {
255            printf("%d ::G722DecTest.c ::[G722 Dec Component] - failure to get data from the audio manager\n", __LINE__);
256            exit (1);
257        }
258#endif
259
260#ifdef OMX_GETTIME
261        GT_START();
262        error = OMX_GetHandle(pHandle, STR_G722DECODER, &AppData, &G722CaBa);
263        GT_END("Call to GetHandle");
264#else
265        error = TIOMX_GetHandle(pHandle, STR_G722DECODER, &AppData, &G722CaBa);
266#endif
267
268        if((error != OMX_ErrorNone) || (*pHandle == NULL)) {
269            APP_DPRINT ("Error in Get Handle function\n");
270            exit (1);
271        }
272
273        /* Create a pipe used to queue data from the callback. */
274        retval = pipe(IpBuf_Pipe);
275        if( retval != 0) {
276            printf( "Error:Fill In Buff Pipe failed to open\n");
277            exit (1);
278        }
279
280        retval = pipe(OpBuf_Pipe);
281        if( retval != 0) {
282            printf( "Error:Empty Out Buff Pipe failed to open\n");
283            exit (1);
284        }
285
286        retval = pipe(Event_Pipe);
287        if( retval != 0) {
288            printf( "Error:Empty Event Pipe failed to open\n");
289            exit (1);
290        }
291
292        /* Send input port config */
293        bFlag = omxSetInputPortParameter (pHandle, nIpBuffs, nIpBufSize);
294        if (bFlag == FALSE) {
295            exit (1);
296        }
297
298        /* Send output port config */
299        bFlag = omxSetOutputPortParameter (pHandle, nOpBuffs, nOpBufSize, gDasfMode);
300        if (bFlag == FALSE) {
301            exit (1);
302        }
303
304        error = OMX_GetExtensionIndex(*pHandle, "OMX.TI.index.config.g722headerinfo",&index);
305        if (error != OMX_ErrorNone) {
306            printf("Error getting extension index\n");
307            exit (1);
308        }
309
310        appPrivate.dasfMode = gDasfMode;
311
312        error = OMX_SetConfig(*pHandle, index, &appPrivate);
313        if(error != OMX_ErrorNone) {
314            error = OMX_ErrorBadParameter;
315            APP_DPRINT("%d :: Error from OMX_SetConfig() function\n",__LINE__);
316            exit (1);
317        }
318#ifdef OMX_GETTIME
319        GT_START();
320#endif
321
322        error = omxUseBuffers (pHandle, gDasfMode, nIpBuffs, nIpBufSize, pInputBufferHeader, nOpBuffs, nOpBufSize, pOutputBufferHeader);
323        if (error != OMX_ErrorNone) {
324            exit (1);
325        }
326
327        /* Send  G722 config for input */
328        bFlag = g722SetInputPort (pHandle, iSampRate);
329        if (bFlag == FALSE) {
330            exit (1);
331        }
332
333        /* Send  G722 config for output */
334        bFlag = g722SetOutputPort (pHandle);
335        if (bFlag == FALSE) {
336            exit (1);
337        }
338
339        if(gDasfMode == 1) {
340            APP_DPRINT("%d :: G722 DECODER RUNNING UNDER DASF MODE\n",__LINE__);
341
342#ifdef RTM_PATH
343            dataPath = DATAPATH_APPLICATION_RTMIXER;
344#endif
345#ifdef ETEEDN_PATH
346            dataPath = DATAPATH_APPLICATION;
347#endif
348            error = OMX_GetExtensionIndex(*pHandle, "OMX.TI.index.config.g722dec.datapath",&index);
349            if (error != OMX_ErrorNone) {
350                printf("Error getting extension index\n");
351                exit (1);
352            }
353            error = OMX_SetConfig (*pHandle, index, &dataPath);
354            if(error != OMX_ErrorNone) {
355                error = OMX_ErrorBadParameter;
356                APP_DPRINT("%d :: G722DecTest.c :: Error from OMX_SetConfig() function\n",__LINE__);
357                exit (1);
358            }
359        }
360        error = OMX_SendCommand(*pHandle, OMX_CommandStateSet, OMX_StateIdle, NULL);
361        if(error != OMX_ErrorNone) {
362            APP_DPRINT ("Error from SendCommand-Idle(Init) State function - error = %d\n",error);
363            exit (1);
364        }
365
366
367        APP_DPRINT("%d :: App :: About to call WaitForState to change to Idle\n",__LINE__);
368        error = WaitForState(pHandle, OMX_StateIdle);
369        APP_DPRINT("%d :: App :: state changed to Idle\n",__LINE__);
370        if(error != OMX_ErrorNone) {
371            APP_DPRINT( "Error:  hAmrEncoder->WaitForState reports an error %X\n", error);
372            exit (1);
373        }
374
375        for (nJdx = 0; nJdx < nCntTest; nJdx++) {
376            if(gDasfMode == 0) {
377                APP_DPRINT("%d :: G722 DECODER RUNNING UNDER FILE MODE\n",__LINE__);
378                fOut = fopen(fname, "w");
379                if(fOut == NULL) {
380                    APP_DPRINT ( "Error:  failed to create the output file \n");
381                    exit (1);
382                }
383                APP_DPRINT("%d :: Op File has created\n",__LINE__);
384            }
385            fIn = fopen(argv[1], "r");
386            if(fIn == NULL) {
387                fprintf(stderr, "Error:  failed to open the file %s for readonly access\n", argv[1]);
388                exit (1);
389            }
390
391            if (tcID == 5) {
392                printf("*********************************************************\n");
393                printf ("App: %d time Sending OMX_StateExecuting Command: TC 5\n", nJdx);
394                printf("*********************************************************\n");
395            }
396            if (tcID == 6) {
397                printf("*********************************************************\n");
398                printf("%d :: App: Outer %d time Sending OMX_StateExecuting Command: TC6\n",__LINE__, nIdx);
399                printf("*********************************************************\n");
400            }
401            /* EOS_sent = OMX_FALSE; */
402#ifdef OMX_GETTIME
403            GT_START();
404#endif
405            error = OMX_SendCommand(*pHandle, OMX_CommandStateSet, OMX_StateExecuting, NULL);
406            if(error != OMX_ErrorNone) {
407                APP_DPRINT ("Error from SendCommand-Executing State function\n");
408                exit (1);
409            }
410
411            APP_DPRINT("%d :: App :: About to call WaitForState to change to Executing\n",__LINE__);
412            error = WaitForState(pHandle, OMX_StateExecuting);
413            gState = OMX_StateExecuting;
414#ifdef OMX_GETTIME
415            GT_START();
416#endif
417            if(error != OMX_ErrorNone) {
418                APP_DPRINT( "Error:  WaitForState reports an error %X\n", error);
419                exit (1);
420            }
421            APP_DPRINT("%d :: App :: state changed to Executing\n",__LINE__);
422
423            error = sendInBuffFillOutBuff (pHandle, nIpBuffs, nOpBuffs, gDasfMode, pInputBufferHeader,  fIn, pOutputBufferHeader);
424            if (error != OMX_ErrorNone) {
425                exit (1);
426            }
427
428            while (1) {
429#ifdef APP_DEBUG
430                getString_OMX_State (strState, gState);
431#endif
432
433                if ((error == OMX_ErrorNone) && (gState != OMX_StateIdle)) {
434                    error = testCases (pHandle, &rfds, tcID, fIn, fOut, &frmCnt, &totalFilled, &tv, gDasfMode, nIpBuffs, pInputBufferHeader, nOpBuffs, pOutputBufferHeader);
435                    if (error != OMX_ErrorNone) {
436                        printf ("<<<<<<<<<<<<<< testCases fault exit >>>>>>>>>>>>>>\n");
437                        exit (1);
438                    }
439                } else if (preempted) {
440                    sched_yield ();
441                } else {
442                    break;
443                    /* goto SHUTDOWN */
444                }
445            } /* While Loop Ending Here */
446            fclose(fIn);
447            if(0 == gDasfMode) {
448                fclose(fOut);
449            }
450
451            if(nIdx != (nCntTest - 1)) {
452                if((tcID == 5) || (tcID == 2)) {
453                    printf("%d :: sleeping here for %d secs\n",__LINE__,SLEEP_TIME);
454                    sleep (SLEEP_TIME);
455                }
456            }
457        }
458#ifdef DSP_RENDERING_ON
459        cmd_data.AM_Cmd = AM_Exit;
460        if((write (g722decfdwrite, &cmd_data, sizeof(cmd_data)))<0)
461            printf("%d :: [G722 Dec Component] - send command to audio manager\n",__LINE__);
462        close(g722decfdwrite);
463        close(g722decfdread);
464#endif
465
466
467        APP_DPRINT ("Sending the StateLoaded Command\n");
468#ifdef OMX_GETTIME
469        GT_START();
470#endif
471        error = OMX_SendCommand(*pHandle,OMX_CommandStateSet, OMX_StateLoaded, NULL);
472
473        error = omxFreeBuffers (pHandle, nIpBuffs, pInputBufferHeader, "Input");
474        if((error != OMX_ErrorNone)) {
475            APP_DPRINT ("%d:: Error in Free Input Buffers function\n",__LINE__);
476            exit (1);
477        }
478        if(gDasfMode == 0) {
479            error = omxFreeBuffers (pHandle, nOpBuffs, pOutputBufferHeader, "Output");
480            if((error != OMX_ErrorNone)) {
481                APP_DPRINT ("%d:: Error in Free Output Buffers function\n",__LINE__);
482                exit (1);
483            }
484        }
485        error = WaitForState(pHandle, OMX_StateLoaded);
486#ifdef OMX_GETTIME
487        GT_END("Call to SendCommand <OMX_StateLoaded>");
488#endif
489        if(error != OMX_ErrorNone) {
490            APP_DPRINT ("%d:: Error from SendCommand-Idle State function\n",__LINE__);
491            exit (1);
492        }
493
494#ifdef WAITFORRESOURCES
495        error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateWaitForResources, NULL);
496        if(error != OMX_ErrorNone) {
497            APP_DPRINT ("%d :: AmrDecTest.c :: Error from SendCommand-Idle State function\n",__LINE__);
498            printf("goto EXIT %d\n",__LINE__);
499
500            goto EXIT;
501        }
502        error = WaitForState(pHandle, OMX_StateWaitForResources);
503
504        /* temporarily put this here until I figure out what should really happen here */
505        sleep(10);
506#endif
507
508        error = OMX_SendCommand(*pHandle, OMX_CommandPortDisable, -1, NULL);
509
510
511#ifdef DSP_RENDERING_ON
512        if((write(g722decfdwrite, &cmd_data, sizeof(cmd_data)))<0)
513            APP_DPRINT ("%d [G722Dec Test] - send command to audio manager\n",__LINE__);
514#endif
515
516        error = TIOMX_FreeHandle(*pHandle);
517        if( (error != OMX_ErrorNone)) {
518            APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
519            exit (1);
520        }
521        APP_DPRINT ("%d:: Free Handle returned Successfully \n\n\n\n",__LINE__);
522        if (pHandle) {
523            free(pHandle);
524        }
525
526        close (Event_Pipe[0]);
527        close (Event_Pipe[1]);
528        close (IpBuf_Pipe[0]);
529        close (IpBuf_Pipe[1]);
530        close (OpBuf_Pipe[0]);
531        close (OpBuf_Pipe[1]);
532
533        sendlastbuffer = 0;
534    }
535
536    error = TIOMX_Deinit();
537    if( (error != OMX_ErrorNone)) {
538        APP_DPRINT("APP: Error in Deinit Core function\n");
539    }
540
541    if (gDasfMode == 0) {
542        printf("**********************************************************\n");
543        printf("NOTE: An output file %s has been created in file system\n",APP_OUTPUT_FILE);
544        printf("**********************************************************\n");
545    }
546#ifdef OMX_GETTIME
547    GT_END("G722_DEC test <End>");
548    OMX_ListDestroy(pListHead);
549#endif
550    exit (0);
551} /* end main () */
552
553/* ================================================================================= * */
554/**
555 * @fn validateArguments() This is the main function of application which gets called.
556 *
557 */
558/* ================================================================================ * */
559boolean validateArguments (int nArgc, char *sArgv [], int *iSampRate, char *fname, int *tcID, int *gDasfMode, int *nIpBuffs, int *nIpBufSize, int *nOpBuffs, int *nOpBufSize)
560{
561    APP_DPRINT("------------------------------------------------------\n");
562    APP_DPRINT("This is Main Thread In G722 DECODER Test Application:\n");
563    APP_DPRINT("Test Core 1.5 - " __DATE__ ":" __TIME__ "\n");
564    APP_DPRINT("------------------------------------------------------\n");
565
566    /* check the input parameters */
567    if (checkInputParameters (nArgc) == FALSE) {
568        return (FALSE);
569    }
570
571    /* check to see that the input file exists */
572    struct stat sb = {0};
573    int status = stat(sArgv[1], &sb);
574    if( status != 0 ) {
575        printf( "Cannot find file %s. (%u)\n", sArgv[1], errno);
576        printf ("Test not performed!!!!!!\n\n");
577        return (FALSE);
578    }
579
580    int nTmp = atoi(sArgv[2]);
581    if (validateSampRate (nTmp) == FALSE) {
582        return (FALSE);
583    }
584    *iSampRate = nTmp;
585
586    *tcID = getNumTestCase (sArgv [3], fname);
587    if (*tcID == 0) {
588        printf("Invalid Test Case ID: exiting...\n");
589        return (FALSE);
590    }
591
592    *gDasfMode = validateArg4 (sArgv [4]);
593    if (*gDasfMode == -1) {
594        return (FALSE);
595    }
596
597    *nIpBuffs = atoi(sArgv[5]);
598    APP_DPRINT("%d :: App: nIpBuf = %d\n",__LINE__, *nIpBuffs);
599    *nIpBufSize = atoi(sArgv[6]);
600    APP_DPRINT("%d :: App: nIpBufSize = %d\n",__LINE__, *nIpBufSize);
601    *nOpBuffs = atoi(sArgv[7]);
602    APP_DPRINT("%d :: App: nOpBuf = %d\n",__LINE__, *nOpBuffs);
603    *nOpBufSize = atoi(sArgv[8]);
604    APP_DPRINT("%d :: App: nOpBufSize = %d\n",__LINE__, *nOpBufSize);
605
606    printf ("Sample rate:\t\t %d\n", *iSampRate);
607    printf ("Test case ID:\t\t %d\n", *tcID);
608    printf ("DasfMode:\t\t %d\n", *gDasfMode);
609    printf ("# of Input Buffers:\t %d\n", *nIpBuffs);
610    printf ("Size of Input Buffers:\t %d\n", *nIpBufSize);
611    printf ("# of Output Buffers:\t %d\n", *nOpBuffs);
612    printf ("Size of Output Buffers:\t %d\n", *nOpBufSize);
613    return (TRUE);
614}
615/**/
616/* ================================================================================= * */
617/**
618 * @fn maxint() gives the maximum of two integers.
619 *
620 * @param a intetger a
621 *
622 * @param b integer b
623 *
624 * @pre          None
625 *
626 * @post         None
627 *
628 *  @return      bigger number
629 *
630 *  @see         None
631 */
632/* ================================================================================ * */
633int maxint(int a, int b)
634{
635    return (a>b) ? a : b;
636}
637
638/* ================================================================================= * */
639/**
640 * @fn WaitForState() Waits for the state to change.
641 *
642 * @param pHandle This is component handle allocated by the OMX core.
643 *
644 * @param DesiredState This is state which the app is waiting for.
645 *
646 * @pre          None
647 *
648 * @post         None
649 *
650 *  @return      Appropriate OMX Error.
651 *
652 *  @see         None
653 */
654/* ================================================================================ * */
655static OMX_ERRORTYPE WaitForState(OMX_HANDLETYPE* pHandle, OMX_STATETYPE DesiredState)
656{
657    OMX_STATETYPE CurState = OMX_StateInvalid;
658    OMX_ERRORTYPE error = OMX_ErrorNone;
659    int nCnt = 0;
660
661    error = OMX_GetState(*pHandle, &CurState);
662    while( (error == OMX_ErrorNone) && (CurState != DesiredState)) {
663        sched_yield();
664        if(nCnt++ == 10) {
665            APP_DPRINT( "Still Waiting, press CTL-C to continue\n");
666        }
667        error = OMX_GetState(*pHandle, &CurState);
668    }
669
670    return error;
671}
672
673
674/* ================================================================================= * */
675/**
676 * @fn EventHandler() This is event handle which is called by the component on
677 * any event change.
678 *
679 * @param hComponent This is component handle allocated by the OMX core.
680 *
681 * @param pAppData This is application private data.
682 *
683 * @param eEvent  This is event generated from the component.
684 *
685 * @param nData1  Data1 associated with the event.
686 *
687 * @param nData2  Data2 associated with the event.
688 *
689 * @param pEventData Any other string event data from component.
690 *
691 * @pre          None
692 *
693 * @post         None
694 *
695 *  @return      Appropriate OMX error.
696 *
697 *  @see         None
698 */
699/* ================================================================================ * */
700OMX_ERRORTYPE EventHandler(OMX_HANDLETYPE hComponent,OMX_PTR pAppData,OMX_EVENTTYPE eEvent,
701                           OMX_U32 nData1, OMX_U32 nData2, OMX_PTR pEventData)
702{
703    OMX_U8        writeValue = 0;
704#ifdef APP_DEBUG
705    char strState [20] = {""};
706    char strTargetState [20] = {""};
707    getString_OMX_State (strState, nData2);
708    getString_OMX_State (strTargetState, nData1);
709#endif
710
711    switch (eEvent) {
712    case OMX_EventResourcesAcquired:
713        APP_DPRINT ("------> OMX_EventResourcesAcquired <--------\n");
714        writeValue = 1;
715        write(Event_Pipe[1], &writeValue, sizeof(OMX_U8));
716        preempted = 0;
717        break;
718    case OMX_EventCmdComplete:
719        APP_DPRINT ("------> OMX_EventCmdComplete<--------\n");
720        gState = (OMX_STATETYPE)nData2;
721        break;
722    case OMX_EventMax:
723        APP_DPRINT ("------> OMX_EventMax<--------\n");
724    case OMX_EventMark:
725        APP_DPRINT ("------> OMX_EventMark<--------\n");
726        break;
727    case OMX_EventPortSettingsChanged:
728        APP_DPRINT ("------> OMX_EventPortSettingsChanged <--------\n");
729        break;
730    case OMX_EventComponentResumed:
731        APP_DPRINT ("------> OMX_EventComponentResumed <--------\n");
732        break;
733    case OMX_EventDynamicResourcesAvailable:
734        APP_DPRINT ("------> OMX_EventDynamicResourcesAvailable <--------\n");
735        break;
736    case OMX_EventPortFormatDetected:
737        break;
738    case OMX_EventError:
739        APP_DPRINT ("------> OMX_EventError <--------\n");
740        APP_DPRINT ( "%d :: G722DecTest.c  Event: OMX_EventError. Component State Changed To %s. Target %s\n", __LINE__, strState, strTargetState);
741        if (nData1 != OMX_ErrorInvalidState && nData1 == OMX_ErrorResourcesPreempted) {
742            APP_DPRINT ("------> \tprocess on  OMX_ErrorResourcesPreempted<--------\n");
743            preempted=1;
744
745            writeValue = 0;
746            write(Event_Pipe[1], &writeValue, sizeof(OMX_U8));
747        } else {
748            APP_DPRINT ("------> \tnothing to process on OMX_EnentError <--------\n");
749        }
750        break;
751    case OMX_EventBufferFlag:
752        APP_DPRINT ("------> OMX_EventBufferFlag <--------\n");
753        APP_DPRINT ( "%d :: G722DecTest.c  Event: OMX_EventBufferFlag. Component State Changed To %s. Target %s\n", __LINE__, strState, strTargetState);
754        /* <<<<< Process Manager <<<<< */
755        writeValue = 2;
756        write(Event_Pipe[1], &writeValue, sizeof(OMX_U8));
757        /* >>>>>>>>>> */
758        break;
759    default:
760        APP_DPRINT ("------> Unknown event <--------\n");
761        break;
762    }
763
764    return OMX_ErrorNone;
765}
766
767/* ================================================================================= * */
768/**
769 * @fn FillBufferDone() Component sens the output buffer to app using this
770 * callback.
771 *
772 * @param hComponent This is component handle allocated by the OMX core.
773 *
774 * @param ptr This is another pointer.
775 *
776 * @param pBuffer This is output buffer.
777 *
778 * @pre          None
779 *
780 * @post         None
781 *
782 *  @return      None
783 *
784 *  @see         None
785 */
786/* ================================================================================ * */
787void FillBufferDone (OMX_HANDLETYPE hComponent, OMX_PTR ptr, OMX_BUFFERHEADERTYPE* pBuffer)
788{
789    write(OpBuf_Pipe[1], &pBuffer, sizeof(pBuffer));
790#ifdef OMX_GETTIME
791    OMX_ERRORTYPE eError = OMX_ErrorNone;
792    int GT_FlagE = 0;  /* Fill Buffer 1 = First Buffer,  0 = Not First Buffer  */
793    int GT_FlagF = 0;  /*Empty Buffer  1 = First Buffer,  0 = Not First Buffer  */
794    static OMX_NODE* pListHead = NULL;
795#endif
796}
797
798/* ================================================================================= * */
799/**
800 * @fn EmptyBufferDone() Component sends the input buffer to app using this
801 * callback.
802 *
803 * @param hComponent This is component handle allocated by the OMX core.
804 *
805 * @param ptr This is another pointer.
806 *
807 * @param pBuffer This is input buffer.
808 *
809 * @pre          None
810 *
811 * @post         None
812 *
813 *  @return      None
814 *
815 *  @see         None
816 */
817/* ================================================================================ * */
818void EmptyBufferDone(OMX_HANDLETYPE hComponent, OMX_PTR ptr, OMX_BUFFERHEADERTYPE* pBuffer)
819{
820    if (!preempted)
821        write(IpBuf_Pipe[1], &pBuffer, sizeof(pBuffer));
822#ifdef OMX_GETTIME
823    if (GT_FlagF == 1 ) { /* First Buffer Reply*/  /* 1 = First Buffer,  0 = Not First Buffer  */
824        GT_END("Call to FillBufferDone  <First: FillBufferDone>");
825        GT_FlagF = 0 ;   /* 1 = First Buffer,  0 = Not First Buffer  */
826    }
827#endif
828}
829
830/* ================================================================================= * */
831/**
832 * @fn send_input_buffer() Sends the input buffer to the component.
833 *
834 * @param pHandle This is component handle allocated by the OMX core.
835 *
836 * @param pBuffer This is the buffer pointer.
837 *
838 * @fIn This is input file handle.
839 *
840 * @pre          None
841 *
842 * @post         None
843 *
844 *  @return      Appropriate OMX error.
845 *
846 *  @see         None
847 */
848/* ================================================================================ * */
849OMX_ERRORTYPE send_input_buffer(OMX_HANDLETYPE pHandle, OMX_BUFFERHEADERTYPE* pBufferHeader, FILE *fIn)
850{
851    OMX_ERRORTYPE error = OMX_ErrorNone;
852    int nRead = 0;
853    static int totalRead = 0;
854    static int fileHdrReadFlag = 0;
855    static int ccnt = 1;
856    if (!fileHdrReadFlag) {
857        fileHdrReadFlag = 1;
858    }
859    nRead = fread(pBufferHeader->pBuffer, 1, pBufferHeader->nAllocLen , fIn);
860
861    if (nRead != 0) {
862        totalRead += nRead;
863        pBufferHeader->nFilledLen = nRead;
864        ccnt++;
865
866        APP_DPRINT("\n*****************************************************\n");
867        APP_DPRINT ("%d :: App:: pBuffer->pBuffer = %p pBuffer->nAllocLen = * %ld, nRead = %d, totalread = %d\n",
868                    __LINE__, pBufferHeader->pBuffer, pBufferHeader->nAllocLen, nRead, totalRead);
869        APP_DPRINT("\n*****************************************************\n");
870    }
871
872    if(sendlastbuffer){
873        sendlastbuffer = 0;
874        pBufferHeader->nFlags = 0;
875
876        return error;
877    }
878
879    if(nRead < pBufferHeader->nAllocLen) {
880        pBufferHeader->nFlags = OMX_BUFFERFLAG_EOS;
881        sendlastbuffer = 1;
882    } else {
883        pBufferHeader->nFlags = 0;
884    }
885    pBufferHeader->nFilledLen = nRead;
886    error = OMX_EmptyThisBuffer(pHandle, pBufferHeader);
887    return error;
888}
889
890/* ================================================================================= * */
891/**
892 * @fn validateArg4() This is the main function of application which gets called.
893 *
894 */
895/* ================================================================================ * */
896int validateArg4 (char *sArg4)
897{
898    int gDasfMode = -1;
899
900    if (!strcmp(sArg4, "DM")) {
901        gDasfMode = 1;
902    } else if (!strcmp(sArg4, "FM")) {
903        gDasfMode = 0;
904    } else {
905        printf("\n%d :: App: Sending Bad Parameter for dasf mode\n",__LINE__);
906        printf("%d :: App: Should Be One of these Modes FM or DM\n",__LINE__);
907        gDasfMode = -1;
908    }
909
910    return (gDasfMode);
911}
912
913/* ================================================================================= * */
914/**
915 * @fn getNumTestCase() This is the main function of application which gets called.
916 *
917 */
918/* ================================================================================ * */
919int getNumTestCase (char *sTestCase, char *sFileName)
920{
921    int iTestCase = 0;
922
923    if(!strcmp(sTestCase,"TC_1")) {
924        iTestCase = 1;
925    } else if (!strcmp(sTestCase,"TC_2")) {
926        iTestCase = 2;
927    } else if (!strcmp(sTestCase,"TC_3")) {
928        iTestCase = 3;
929    } else if (!strcmp(sTestCase,"TC_4")) {
930        iTestCase = 4;
931    } else if (!strcmp(sTestCase,"TC_5")) {
932        iTestCase = 5;
933    } else if (!strcmp(sTestCase,"TC_6")) {
934        iTestCase = 6;
935    } else if (!strcmp(sTestCase,"TC_7")) {
936        iTestCase = 7;
937    } else if (!strcmp(sTestCase,"TC_8")) {
938        iTestCase = 8;
939    } else if (!strcmp(sTestCase,"TC_9")) {
940        iTestCase = 9;
941    }
942    printTestCaseInfo (iTestCase, sFileName);
943
944    return (iTestCase);
945}
946
947/* ================================================================================= * */
948/**
949 * @fn printTestCaseInfo() This is the main function of application which gets called.
950 *
951 */
952/* ================================================================================ * */
953void printTestCaseInfo (int iTestCase, char *sFileName)
954{
955    switch (iTestCase) {
956    case 1:
957    case 7:
958    case 8:
959        printf ("-------------------------------------\n");
960        printf ("Testing Simple PLAY till EOF \n");
961        printf ("-------------------------------------\n");
962        strcat(sFileName, ".pcm");
963        break;
964    case 2:
965        printf ("-------------------------------------\n");
966        printf ("Testing Basic Stop \n");
967        printf ("-------------------------------------\n");
968        strcat(sFileName, "_tc2.pcm");
969        break;
970    case 3:
971        printf ("-------------------------------------\n");
972        printf ("Testing PAUSE & RESUME Command\n");
973        printf ("-------------------------------------\n");
974        strcat(sFileName, ".pcm");
975        break;
976    case 4:
977        printf ("---------------------------------------------\n");
978        printf ("Testing STOP Command by Stopping In-Between\n");
979        printf ("---------------------------------------------\n");
980        break;
981    case 5:
982        printf ("-------------------------------------------------\n");
983        printf ("Testing Repeated PLAY without Deleting Component\n");
984        printf ("-------------------------------------------------\n");
985        strcat(sFileName,"_tc5.pcm");
986        break;
987    case 6:
988        printf ("------------------------------------------------\n");
989        printf ("Testing Repeated PLAY with Deleting Component\n");
990        printf ("------------------------------------------------\n");
991        strcat(sFileName,"_tc6.pcm");
992        break;
993    case 9:
994        printf ("------------------------------------------------\n");
995        printf ("TimeStamp, TickCounts\n");
996        printf ("------------------------------------------------\n");
997        strcat(sFileName,"_tc6.pcm");
998        break;
999    }
1000
1001    return;
1002}
1003
1004/* ================================================================================= * */
1005/**
1006 * @fn checkInputParameters() This is the main function of application which gets called.
1007 *
1008 */
1009/* ================================================================================ * */
1010boolean checkInputParameters (iNumParams)
1011{
1012    if(iNumParams != 9) {
1013        printf("Wrong Arguments: See Below:\n\n");
1014        printf("%d :: Usage: [TestApp] [Input File] [Input File Bit Rate] [TC ID]\
1015[FM/DM] [NB INPUT BUF] [INPUT BUF SIZE] [NB OUTPUT BUF] [OUTPUT BUF SIZE]\n",__LINE__);
1016        return (FALSE);
1017    }
1018    return (TRUE);
1019}
1020
1021/* ================================================================================= * */
1022/**
1023 * @fn validateSampRate() This is the main function of application which gets called.
1024 *
1025 */
1026/* ================================================================================ * */
1027boolean validateSampRate (int iSampRate)
1028{
1029    if (iSampRate == 64000) {
1030        return (TRUE);
1031    } else if(iSampRate == 56000) {
1032        return (TRUE);
1033    } else if(iSampRate == 48000) {
1034        return (TRUE);
1035    } else if (iSampRate == INVALID_SAMPLING_FREQ) {
1036        printf("***********************************************************\n");
1037        printf("%d :: App: Note: Invalid Frequency has been specified by App\n",__LINE__);
1038        printf("***********************************************************\n");
1039        return (FALSE);
1040    } else {
1041        printf ("%d :: Sample Frequency Not Supported: \n", __LINE__);
1042        printf ("Supported frequencies are: 64000 or 56000 or 48000.\n");
1043        printf ("If you want to specify invalid sampling frequency, specify %d and test the component for error.\n",
1044                INVALID_SAMPLING_FREQ);
1045        printf("%d :: Exiting...........\n",__LINE__);
1046        return (FALSE);
1047    }
1048    printf ("Unspecified error.\n");
1049    return (FALSE);
1050}
1051
1052/* ================================================================================= * */
1053/**
1054 * @fn omxSetInputPortParameter() This is the main function of application which gets called.
1055 *
1056 */
1057/* ================================================================================ * */
1058boolean omxSetInputPortParameter (OMX_HANDLETYPE *pHandle, int nIpBuffs, int nIpBufSize)
1059{
1060    OMX_PARAM_PORTDEFINITIONTYPE pCompPrivateStruct;
1061    OMX_ERRORTYPE error = OMX_ErrorNone;
1062
1063    pCompPrivateStruct.nSize                  = sizeof (OMX_PARAM_PORTDEFINITIONTYPE);
1064    pCompPrivateStruct.eDir                   = OMX_DirInput;
1065    pCompPrivateStruct.nBufferCountActual     = nIpBuffs;
1066    pCompPrivateStruct.nBufferSize            = nIpBufSize;
1067    pCompPrivateStruct.format.audio.eEncoding = OMX_AUDIO_CodingPCM;
1068    pCompPrivateStruct.bEnabled               = OMX_TRUE;
1069    pCompPrivateStruct.bPopulated             = OMX_FALSE;
1070    pCompPrivateStruct.nPortIndex             = OMX_DirInput;
1071#ifdef OMX_GETTIME
1072    GT_START();
1073    error = OMX_SetParameter(*pHandle,OMX_IndexParamPortDefinition, &pCompPrivateStruct);
1074    GT_END("Set Parameter Test-SetParameter");
1075#else
1076    error = OMX_SetParameter(*pHandle,OMX_IndexParamPortDefinition, &pCompPrivateStruct);
1077#endif
1078    if(error != OMX_ErrorNone) {
1079        error = OMX_ErrorBadParameter;
1080        printf ("%d :: OMX_ErrorBadParameter\n",__LINE__);
1081    }
1082
1083    return (TRUE);
1084}
1085
1086/* ================================================================================= * */
1087/**
1088 * @fn omxSetOutputPortParameter() This is the main function of application which gets called.
1089 *
1090 */
1091/* ================================================================================ * */
1092boolean omxSetOutputPortParameter (OMX_HANDLETYPE *pHandle, int nOpBuffs, int nOpBufSize, int gDasfMode)
1093{
1094    OMX_PARAM_PORTDEFINITIONTYPE pCompPrivateStruct;
1095    OMX_ERRORTYPE error = OMX_ErrorNone;
1096
1097    pCompPrivateStruct.eDir                   = OMX_DirOutput;
1098    pCompPrivateStruct.nBufferCountActual     = (gDasfMode == 1)? 0 : nOpBuffs;
1099    pCompPrivateStruct.nBufferSize            = nOpBufSize;
1100    pCompPrivateStruct.format.audio.eEncoding = OMX_AUDIO_CodingPCM;
1101    pCompPrivateStruct.bEnabled               = OMX_TRUE;
1102    pCompPrivateStruct.bPopulated             = (gDasfMode == 1)? OMX_TRUE : OMX_FALSE;
1103    pCompPrivateStruct.nPortIndex             = OMX_DirOutput;
1104
1105#ifdef OMX_GETTIME
1106    GT_START();
1107    error = OMX_SetParameter(*pHandle,OMX_IndexParamPortDefinition, &pCompPrivateStruct);
1108    GT_END("Set Parameter Test-SetParameter");
1109#else
1110    error = OMX_SetParameter(*pHandle,OMX_IndexParamPortDefinition, &pCompPrivateStruct);
1111#endif
1112    if(error != OMX_ErrorNone) {
1113        error = OMX_ErrorBadParameter;
1114        printf ("%d :: OMX_ErrorBadParameter\n",__LINE__);
1115    }
1116
1117    return (TRUE);
1118}
1119
1120/* ================================================================================= * */
1121/**
1122 * @fn g722SetInputPort() This is the main function of application which gets called.
1123 *
1124 */
1125/* ================================================================================ * */
1126boolean g722SetInputPort (OMX_HANDLETYPE *pHandle, int iSampRate)
1127{
1128    OMX_AUDIO_PARAM_PCMMODETYPE pG722Param;
1129    OMX_ERRORTYPE error = OMX_ErrorNone;
1130
1131    pG722Param.nSize                    = sizeof(OMX_AUDIO_PARAM_PCMMODETYPE);
1132    pG722Param.nVersion.s.nVersionMajor = 0xF1;
1133    pG722Param.nVersion.s.nVersionMinor = 0xF2;
1134    pG722Param.nPortIndex               = OMX_DirInput;
1135    pG722Param.nChannels                = 1; /* mono */
1136    pG722Param.nBitPerSample            = 8;
1137    pG722Param.eNumData                 = OMX_NumericalDataUnsigned;
1138    pG722Param.eEndian                  = OMX_EndianLittle;
1139    pG722Param.bInterleaved             = OMX_FALSE;
1140    pG722Param.ePCMMode                 = OMX_AUDIO_PCMModeLinear;
1141    pG722Param.nSamplingRate            = iSampRate;
1142
1143#ifdef OMX_GETTIME
1144    GT_START();
1145    error = OMX_SetParameter (*pHandle, OMX_IndexParamAudioPcm, &pG722Param);
1146    GT_END("Set Parameter Test-SetParameter");
1147#else
1148    error = OMX_SetParameter (*pHandle, OMX_IndexParamAudioPcm, &pG722Param);
1149#endif
1150
1151    if (error != OMX_ErrorNone) {
1152        error = OMX_ErrorBadParameter;
1153        return (FALSE);
1154    }
1155    return (TRUE);
1156}
1157
1158/* ================================================================================= * */
1159/**
1160 * @fn g722SetOutputPort() This is the main function of application which gets called.
1161 *
1162 */
1163/* ================================================================================ * */
1164boolean g722SetOutputPort (OMX_HANDLETYPE *pHandle)
1165{
1166    OMX_AUDIO_PARAM_PCMMODETYPE pG722Param;
1167    OMX_ERRORTYPE error = OMX_ErrorNone;
1168
1169    pG722Param.nSize                    = sizeof(OMX_AUDIO_PARAM_PCMMODETYPE);
1170    pG722Param.nVersion.s.nVersionMajor = 0xF1;
1171    pG722Param.nVersion.s.nVersionMinor = 0xF2;
1172    pG722Param.nPortIndex               = OMX_DirOutput;
1173    pG722Param.nChannels                = 1; /* mono */
1174    pG722Param.nBitPerSample            = 16;
1175    pG722Param.nSamplingRate            = 16000;
1176    pG722Param.eNumData                 = OMX_NumericalDataUnsigned;
1177    pG722Param.eEndian                  = OMX_EndianLittle;
1178    pG722Param.bInterleaved             = OMX_FALSE;
1179    pG722Param.ePCMMode                 = OMX_AUDIO_PCMModeLinear;
1180
1181#ifdef OMX_GETTIME
1182    GT_START();
1183    error = OMX_SetParameter (*pHandle, OMX_IndexParamAudioPcm, &pG722Param);
1184    GT_END("Set Parameter Test-SetParameter");
1185#else
1186    error = OMX_SetParameter (*pHandle, OMX_IndexParamAudioPcm, &pG722Param);
1187#endif
1188
1189    if (error != OMX_ErrorNone) {
1190        error = OMX_ErrorBadParameter;
1191        return (FALSE);
1192    }
1193    return (TRUE);
1194}
1195
1196/* ================================================================================= * */
1197/**
1198 * @fn omxSetConfigMute() This is the main function of application which gets called.
1199 *
1200 */
1201/* ================================================================================ * */
1202boolean omxSetConfigMute (OMX_HANDLETYPE *pHandle, OMX_BOOL bMute)
1203{
1204    OMX_AUDIO_CONFIG_MUTETYPE    pCompPrivateStructMute;
1205    OMX_ERRORTYPE error = OMX_ErrorNone;
1206
1207    /* default setting for Mute/Unmute */
1208    pCompPrivateStructMute.nSize                    = sizeof (OMX_AUDIO_CONFIG_MUTETYPE);
1209    pCompPrivateStructMute.nVersion.s.nVersionMajor = 0xF1;
1210    pCompPrivateStructMute.nVersion.s.nVersionMinor = 0xF2;
1211    pCompPrivateStructMute.nPortIndex               = OMX_DirInput;
1212    pCompPrivateStructMute.bMute                    = bMute;
1213
1214    error = OMX_SetConfig(*pHandle, OMX_IndexConfigAudioMute, &pCompPrivateStructMute);
1215    if (error != OMX_ErrorNone) {
1216        error = OMX_ErrorBadParameter;
1217        return (FALSE);
1218    }
1219    return (TRUE);
1220}
1221
1222/* ================================================================================= * */
1223/**
1224 * @fn omxSetConfigVolume() This is the main function of application which gets called.
1225 *
1226 */
1227/* ================================================================================ * */
1228boolean omxSetConfigVolume (OMX_HANDLETYPE *pHandle, OMX_S32 nVolume)
1229{
1230    OMX_AUDIO_CONFIG_VOLUMETYPE  pCompPrivateStructVolume;
1231    OMX_ERRORTYPE error = OMX_ErrorNone;
1232
1233    /* default setting for volume */
1234    pCompPrivateStructVolume.nSize                    = sizeof(OMX_AUDIO_CONFIG_VOLUMETYPE);
1235    pCompPrivateStructVolume.nVersion.s.nVersionMajor = 0xF1;
1236    pCompPrivateStructVolume.nVersion.s.nVersionMinor = 0xF2;
1237    pCompPrivateStructVolume.nPortIndex               = OMX_DirInput;
1238    pCompPrivateStructVolume.bLinear                  = OMX_FALSE;
1239    pCompPrivateStructVolume.sVolume.nValue           = nVolume;  /* actual volume */
1240    pCompPrivateStructVolume.sVolume.nMin             = 0;   /* min volume */
1241    pCompPrivateStructVolume.sVolume.nMax             = 100; /* max volume */
1242
1243    error = OMX_SetConfig(*pHandle, OMX_IndexConfigAudioVolume, &pCompPrivateStructVolume);
1244    if (error != OMX_ErrorNone) {
1245        error = OMX_ErrorBadParameter;
1246        return (FALSE);
1247    }
1248    return (TRUE);
1249}
1250
1251/* ================================================================================= * */
1252/**
1253 * @fn omxUseBuffers() This is the main function of application which gets called.
1254 *
1255 */
1256/* ================================================================================ * */
1257OMX_ERRORTYPE omxUseBuffers (OMX_HANDLETYPE *pHandle, int gDasfMode, int nIpBuffs, int nIpBufSize, OMX_BUFFERHEADERTYPE *pInputBufferHeader [], int nOpBuffs, int nOpBufSize, OMX_BUFFERHEADERTYPE *pOutputBufferHeader [])
1258{
1259    OMX_ERRORTYPE error = OMX_ErrorNone;
1260    int i=0;                                                                                    /* 0j0 <<<<<<<<<<< */
1261
1262#ifndef USE_BUFFER
1263    for(i=0; i < nIpBuffs; i++) {
1264        APP_DPRINT("%d :: About to call OMX_AllocateBuffer On Input\n",__LINE__);
1265        error = OMX_AllocateBuffer(*pHandle, &pInputBufferHeader[i], 0, NULL, nIpBufSize);
1266        APP_DPRINT("%d :: called OMX_AllocateBuffer\n",__LINE__);
1267        if(error != OMX_ErrorNone) {
1268            APP_DPRINT("%d :: Error returned by OMX_AllocateBuffer()\n",__LINE__);
1269            return (error);
1270        }
1271    }
1272
1273    if (gDasfMode == 0) {
1274        for(i=0; i < nOpBuffs; i++) {
1275            error = OMX_AllocateBuffer(*pHandle,&pOutputBufferHeader[i],1,NULL,nOpBufSize);
1276            if(error != OMX_ErrorNone) {
1277                APP_DPRINT("%d :: Error returned by OMX_AllocateBuffer()\n",__LINE__);
1278                return (error);
1279            }
1280        }
1281    }
1282#else
1283    OMX_U8* pInputBuffer  [MAX_NUM_OF_BUFS] = {NULL};
1284    OMX_U8* pOutputBuffer [MAX_NUM_OF_BUFS] = {NULL};
1285
1286    for(i=0; i<nIpBuffs; i++) {
1287        if (pInputBuffer[i] == NULL) {
1288            pInputBuffer[i] = (OMX_U8*)malloc(nIpBufSize);
1289            APP_DPRINT("%d :: About to call OMX_UseBuffer On Input\n",__LINE__);
1290            printf("%d :: About to call OMX_UseBuffer On Input\n",__LINE__);
1291            error = OMX_UseBuffer(*pHandle,&pInputBufferHeader[i],0,NULL,nIpBufSize,pInputBuffer[i]);
1292            if(error != OMX_ErrorNone) {
1293                APP_DPRINT("%d :: Error returned by OMX_UseBuffer()\n",__LINE__);
1294                return (error);
1295            }
1296        }
1297    }
1298
1299    if (gDasfMode == 0) {
1300        for(i=0; i<nOpBuffs; i++) {
1301            if (pOutputBuffer[i] == NULL) {
1302                pOutputBuffer[i] = malloc (nOpBufSize + 256);
1303                pOutputBuffer[i] = pOutputBuffer[i] + 128;
1304                /* allocate output buffer */
1305                APP_DPRINT("%d :: About to call OMX_UseBuffer On Output\n",__LINE__);
1306                printf("%d :: About to call OMX_UseBuffer On Output\n",__LINE__);
1307                error = OMX_UseBuffer(*pHandle,&pOutputBufferHeader[i],1,NULL,nOpBufSize,pOutputBuffer[i]);
1308                if(error != OMX_ErrorNone) {
1309                    APP_DPRINT("%d :: Error returned by OMX_UseBuffer()\n",__LINE__);
1310                    return (error);
1311                }
1312                pOutputBufferHeader[i]->nFilledLen = 0;
1313            }
1314        }
1315    }
1316#endif
1317    return (error);
1318}
1319
1320/* ================================================================================= * */
1321/**
1322 * @fn testCases() This is the main function of application which gets called.
1323 *
1324 */
1325/* ================================================================================ * */
1326OMX_ERRORTYPE testCases (OMX_HANDLETYPE *pHandle, fd_set *rfds, int tcID, FILE *fIn, FILE *fOut, int *frmCnt, int *totalFilled, struct timeval *tv, int gDasfMode, int nIpBuffs, OMX_BUFFERHEADERTYPE *pInputBufferHeader [], int nOpBuffs, OMX_BUFFERHEADERTYPE *pOutputBufferHeader [])
1327{
1328    boolean bFlag = true;
1329    static int frmCount = 0;
1330
1331    OMX_ERRORTYPE error = OMX_ErrorNone;
1332    int fdmax = maxint(IpBuf_Pipe [0], OpBuf_Pipe [0]);
1333    fdmax = maxint (fdmax, Event_Pipe [0]);
1334
1335    FD_ZERO (rfds);
1336    FD_SET (IpBuf_Pipe[0], rfds);
1337    FD_SET (OpBuf_Pipe[0], rfds);
1338    FD_SET (Event_Pipe[0], rfds);
1339    tv->tv_sec  = 1;
1340    tv->tv_usec = 0;
1341
1342    int retval = select(fdmax+1, rfds, NULL, NULL, tv);
1343    if(retval == -1) {
1344        perror("select()");
1345        APP_DPRINT ( " : Error \n");
1346        return (OMX_EventError);
1347    }
1348
1349    if(retval == 0) {
1350        APP_DPRINT ("%d :: BasicFn App Timeout !!!!!!!!!!! \n",__LINE__);
1351    }
1352    /*****/
1353    frmCount++;
1354
1355    switch (tcID) {
1356    case 1:
1357    case 5:
1358    case 6:
1359        if(FD_ISSET(IpBuf_Pipe[0], rfds)) {
1360            OMX_BUFFERHEADERTYPE* pBuffer = NULL;
1361            read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1362            APP_DPRINT("%d :: APP: input buffer received, filled length = %d\n",__LINE__,(int)pBuffer->nFilledLen);
1363            error = send_input_buffer (*pHandle, pBuffer, fIn);
1364            if (error != OMX_ErrorNone) {
1365                return (error);
1366            }
1367        }
1368        break;
1369    case 2:
1370    case 4:
1371        if(FD_ISSET(IpBuf_Pipe[0], rfds)) {
1372            if(*frmCnt == 4) {
1373                APP_DPRINT("Shutting down ---------- \n");
1374#ifdef OMX_GETTIME
1375                GT_START();
1376#endif
1377                error = OMX_SendCommand(*pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL);
1378                if(error != OMX_ErrorNone) {
1379                    fprintf (stderr,"Error from SendCommand-Idle(Stop) State function\n");
1380                    return (error);
1381                }
1382                if(tcID == 4) {
1383                    error = testCase_2_4 (pHandle, gDasfMode, fIn, fOut, nIpBuffs, pInputBufferHeader);
1384                    if(error != OMX_ErrorNone) {
1385                        fprintf (stderr,"Error from SendCommand-Idle(Stop) State function\n");
1386                        return (error);
1387                    }
1388                }
1389            } else {
1390                OMX_BUFFERHEADERTYPE* pBuffer = NULL;
1391                read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1392                error = send_input_buffer (*pHandle, pBuffer, fIn);
1393                if (error != OMX_ErrorNone) {
1394                    return (error);
1395                }
1396            }
1397            (*frmCnt)++;
1398        }
1399        break;
1400    case 3:
1401        if(frmCount == 3 || frmCount == 6) {
1402            error = testCase_3 (pHandle);
1403            if(error != OMX_ErrorNone) {
1404                return (error);
1405            }
1406        }
1407
1408        if(FD_ISSET(IpBuf_Pipe[0], rfds)) {
1409
1410            OMX_BUFFERHEADERTYPE* pBuffer = NULL;
1411            read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1412            error = send_input_buffer (*pHandle, pBuffer, fIn);
1413            if (error != OMX_ErrorNone) {
1414                return (error);
1415            }
1416
1417            (*frmCnt)++;
1418        }
1419        break;
1420    case 7:
1421        /* test mute/unmute playback stream */
1422        if(FD_ISSET(IpBuf_Pipe[0], rfds)) {
1423            OMX_BUFFERHEADERTYPE* pBuffer = NULL;
1424            read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1425            error = send_input_buffer (*pHandle, pBuffer, fIn);
1426            if (error != OMX_ErrorNone) {
1427                return (error);
1428            }
1429            (*frmCnt)++;
1430        }
1431
1432        if(*frmCnt == 3) {
1433            printf("************Mute the playback stream*****************\n");
1434            bFlag = omxSetConfigMute (pHandle, OMX_TRUE);
1435            if (bFlag == FALSE) {
1436                return (error);
1437            }
1438        }
1439
1440        if(*frmCnt == 6) {
1441            printf("************Unmute the playback stream*****************\n");
1442            bFlag = omxSetConfigMute (pHandle, OMX_FALSE);
1443            if (bFlag == FALSE) {
1444                return (error);
1445            }
1446        }
1447        break;
1448
1449    case 8:
1450        /* test set volume for playback stream */
1451        if(FD_ISSET(IpBuf_Pipe[0], rfds)) {
1452            OMX_BUFFERHEADERTYPE* pBuffer = NULL;
1453            read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1454            error = send_input_buffer (*pHandle, pBuffer, fIn);
1455            if (error != OMX_ErrorNone) {
1456                return (error);
1457            }
1458
1459            (*frmCnt)++;
1460        }
1461
1462        if(*frmCnt == 3) {
1463            printf("************Set stream volume to high*****************\n");
1464            bFlag = omxSetConfigVolume (pHandle, 0x8000);
1465            if (bFlag == FALSE) {
1466                return (error);
1467            }
1468        }
1469
1470        if(*frmCnt == 6) {
1471            printf("************Set stream volume to low*****************\n");
1472            bFlag = omxSetConfigVolume (pHandle, 0x1000);
1473            if (bFlag == FALSE) {
1474                return (error);
1475            }
1476        }
1477        break;
1478    case 9:
1479        if(FD_ISSET(IpBuf_Pipe[0], rfds)) {
1480            OMX_BUFFERHEADERTYPE* pBuffer=  NULL;
1481            read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1482            APP_DPRINT("%d :: APP: input buffer received, filled length = %d\n",__LINE__,(int)pBuffer->nFilledLen);
1483            error = send_input_buffer (*pHandle, pBuffer, fIn);
1484            if (error != OMX_ErrorNone) {
1485                return (error);
1486            }
1487
1488            pBuffer->nTimeStamp = (OMX_S64) rand() % 70;
1489            pBuffer->nTickCount = (OMX_S64) rand() % 70;
1490            printf("SENDING TIMESTAMP = %d\n", (int) pBuffer->nTimeStamp);
1491            printf("SENDING TICK COUNT = %ld\n", pBuffer->nTickCount);
1492        }
1493        break;
1494
1495    default:
1496        APP_DPRINT("%d :: ### Running Simple DEFAULT Case Here ###\n",__LINE__);
1497    } /* end switch */
1498    /**********************/
1499    if( FD_ISSET(OpBuf_Pipe[0], rfds) ) {
1500        OMX_BUFFERHEADERTYPE* pBuf = NULL;
1501        read(OpBuf_Pipe[0], &pBuf, sizeof(pBuf));
1502        if(pBuf->nFlags == OMX_BUFFERFLAG_EOS){
1503            printf("EOS received by App, Stopping the component\n");
1504            pBuf->nFlags = 0;
1505            /*            StopComponent(pHandle);*/
1506            fseek(fIn, 0, SEEK_SET);
1507        }
1508        if(pBuf->nFilledLen == 0) {
1509            APP_DPRINT("%d :: APP: output buffer received, filled length = %d, totalfilled = %d\n",__LINE__,(int)pBuf->nFilledLen,totalFilled);
1510        } else {
1511            APP_DPRINT("%d :: APP: output buffer received, filled length = %d, totalfilled = %d\n",__LINE__,(int)pBuf->nFilledLen,totalFilled);
1512            fwrite(pBuf->pBuffer, 1, pBuf->nFilledLen, fOut);
1513        }
1514        totalFilled += pBuf->nFilledLen;
1515        fflush(fOut);
1516        OMX_FillThisBuffer(*pHandle, pBuf);
1517    }
1518    /*************/
1519    /*<<<<<<< Process Manager <<<<<<< */
1520    if ( FD_ISSET (Event_Pipe[0], rfds) ) {
1521        OMX_U8 pipeContents =0;
1522        read(Event_Pipe[0], &pipeContents, sizeof(OMX_U8));
1523
1524        if (pipeContents == 0) {
1525
1526            printf("Test app received OMX_ErrorResourcesPreempted\n");
1527            WaitForState(pHandle,OMX_StateIdle);
1528            int i;
1529            for (i=0; i < nIpBuffs; i++) {
1530                error = OMX_FreeBuffer (pHandle,OMX_DirInput,pInputBufferHeader[i]);
1531                if( (error != OMX_ErrorNone)) {
1532                    APP_DPRINT ("%d :: G722DecTest.c :: Error in Free Handle function\n",__LINE__);
1533                }
1534            }
1535
1536            if (gDasfMode == 0) {
1537                for (i=0; i < nOpBuffs; i++) {
1538                    error = OMX_FreeBuffer (pHandle,OMX_DirOutput,pOutputBufferHeader[i]);
1539                    if( (error != OMX_ErrorNone)) {
1540                        APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
1541                    }
1542                }
1543            }
1544
1545#ifdef USE_BUFFER
1546            /* newfree the App Allocated Buffers */
1547            APP_DPRINT("%d :: AmrDecTest.c :: Freeing the App Allocated Buffers in TestApp\n",__LINE__);
1548            for(i=0; i < nIpBuffs; i++) {
1549                APP_MEMPRINT("%d::: [TESTAPPFREE] pInputBuffer[%d] = %p\n",__LINE__,i,pInputBuffer[i]);
1550                if(pInputBuffer[i] != NULL){
1551                    pInputBuffer[i] = pInputBuffer[i] - 128;
1552                    newfree(pInputBuffer[i]);
1553                    pInputBuffer[i] = NULL;
1554                }
1555            }
1556            for(i=0; i < numOutputBuffers; i++) {
1557                APP_MEMPRINT("%d::: [TESTAPPFREE] pOutputBuffer[%d] = %p\n",__LINE__,i, pOutputBuffer[i]);
1558                if(pOutputBuffer[i] != NULL){
1559                    pOutputBuffer[i] = pOutputBuffer[i] - 128;
1560                    newfree(pOutputBuffer[i]);
1561                    pOutputBuffer[i] = NULL;
1562                }
1563            }
1564#endif
1565
1566            OMX_SendCommand(*pHandle,OMX_CommandStateSet, OMX_StateIdle/*OMX_StateLoaded*/,NULL);
1567            WaitForState(pHandle, OMX_StateIdle/*OMX_StateLoaded*/);
1568#ifdef WAITFORRESOURCES
1569            OMX_SendCommand(*pHandle,OMX_CommandStateSet,OMX_StateWaitForResources,NULL);
1570            WaitForState(pHandle,OMX_StateWaitForResources);
1571#endif
1572        } else if (pipeContents == 1) {
1573
1574            printf("Test app received OMX_ErrorResourcesAcquired\n");
1575
1576            OMX_SendCommand(*pHandle,OMX_CommandStateSet,OMX_StateIdle,NULL);
1577            int i = 0;
1578            for (i=0; i < nIpBuffs; i++) {
1579                /* allocate input buffer */
1580                error = OMX_AllocateBuffer (*pHandle,&pInputBufferHeader[i],0,NULL, G722D_INPUT_BUFFER_SIZE *3); /*To have enought space for    */
1581                if(error != OMX_ErrorNone) {
1582                    APP_DPRINT("%d :: G722DecTest.c :: Error returned by OMX_AllocateBuffer()\n",__LINE__);
1583                }
1584            }
1585            WaitForState(pHandle,OMX_StateIdle);
1586            OMX_SendCommand(*pHandle,OMX_CommandStateSet,OMX_StateExecuting,NULL);
1587            WaitForState(pHandle,OMX_StateExecuting);
1588            rewind(fIn);
1589
1590            for (i=0; i < nIpBuffs;i++) {
1591                send_input_buffer(*pHandle, pInputBufferHeader[i], fIn);
1592            }
1593        } else if (pipeContents == 2) {
1594            OMX_STATETYPE CurState = OMX_StateInvalid;
1595            char strCurrState [20] = {""};
1596
1597            error = OMX_GetState(*pHandle, &CurState);
1598            getString_OMX_State (strCurrState, CurState);
1599            error = OMX_SendCommand(*pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL);
1600            error = WaitForState(pHandle, OMX_StateIdle);
1601#ifdef OMX_GETTIME
1602            GT_END("Call to SendCommand <OMX_StateIdle>");
1603#endif
1604            if(error != OMX_ErrorNone) {
1605                printf("\nError:  WaitForState reports an error %X!!!!!!!\n", error);
1606                return error;
1607            }
1608            /*
1609                          #if 1
1610                          error = OMX_SendCommand(*pHandle,OMX_CommandStateSet, OMX_StateLoaded, NULL);
1611                          if(error != OMX_ErrorNone) {
1612                          APP_DPRINT ("%d :: G722DecTest.c :: Error from SendCommand-Idle State function\n",__LINE__);
1613                          printf("goto EXIT %d\n",__LINE__);
1614
1615                          *goto EXIT;*
1616                          return (-1);
1617                          }
1618                          error = WaitForState(pHandle, OMX_StateLoaded);
1619                          if(error != OMX_ErrorNone) {
1620                          APP_DPRINT( "%d :: G722DecTest.c :: Error:  WaitForState reports an error %X\n",__LINE__, error);
1621                          printf("goto EXIT %d\n",__LINE__);
1622                          *goto EXIT;*
1623                          return (-1);
1624                          }
1625                          #   ifdef OMX_GETTIME
1626                          GT_END("Call to SendCommand <OMX_StateIdle>"); *<OMX_StateLoaded>");*
1627                          #   endif
1628
1629                          #endif
1630            */
1631            /*goto SHUTDOWN;*/
1632            return (OMX_ErrorNone);
1633            /**/
1634        } else {
1635            printf ("--------> Pipe content = %d <----------\n", pipeContents);
1636        }
1637    }
1638    return (error);
1639}
1640
1641/* ================================================================================= * */
1642/**
1643 * @fn testCase_2_4() This is the main function of application which gets called.
1644 *
1645 */
1646/* ================================================================================ * */
1647OMX_ERRORTYPE testCase_2_4 (OMX_HANDLETYPE *pHandle, int gDasfMode, FILE *fIn, FILE *fOut, int nIpBuffs, OMX_BUFFERHEADERTYPE *pInputBufferHeader  [])
1648{
1649    OMX_ERRORTYPE error = OMX_ErrorNone;
1650
1651    APP_STATEPRINT ("*********** Waiting for state to change to Idle ************\n\n");
1652
1653#ifdef OMX_GETTIME
1654    GT_END("Call to SendCommand <OMX_StateIdle>");
1655#endif
1656
1657    error = WaitForState(pHandle, OMX_StateIdle);
1658    if(error != OMX_ErrorNone) {
1659        fprintf(stderr, "Error:  WaitForState reports an error %X\n", error);
1660        return (error);
1661    }
1662    APP_STATEPRINT("*********** State Changed to Idle ************\n\n");
1663
1664    printf("Component Has Stopped here and waiting for %d seconds before it plays further\n",SLEEP_TIME);
1665    sleep(SLEEP_TIME);
1666
1667    APP_STATEPRINT("*************** Execute command to Component *******************\n");
1668
1669#ifdef OMX_GETTIME
1670    GT_START();
1671#endif
1672
1673    error = OMX_SendCommand(*pHandle, OMX_CommandStateSet,OMX_StateExecuting, NULL);
1674    if(error != OMX_ErrorNone) {
1675        fprintf (stderr,"Error from SendCommand-Executing State function\n");
1676        return (error);
1677    }
1678
1679    APP_STATEPRINT("*********** Waiting for state to change to Executing ************\n\n");
1680    error = WaitForState(pHandle, OMX_StateExecuting);
1681
1682#ifdef OMX_GETTIME
1683    GT_START();
1684#endif
1685    if(error != OMX_ErrorNone) {
1686        fprintf(stderr, "Error:  WaitForState reports an error %X\n", error);
1687        return (error);
1688    }
1689    APP_STATEPRINT("*********** State Changed to Executing ************\n\n");
1690
1691    if (gDasfMode == 0) {
1692        /*rewind input and output files*/
1693        fseek(fIn, 0L, SEEK_SET);
1694        fseek(fOut, 0L, SEEK_SET);
1695    }
1696    int k = 0;
1697    for (k=0; k < nIpBuffs; k++) {
1698        error = send_input_buffer (*pHandle, pInputBufferHeader[k], fIn);
1699    }
1700    return (error);
1701}
1702/* ================================================================================= * */
1703/**
1704 * @fn testCase_3() This is the main function of application which gets called.
1705 *
1706 */
1707/* ================================================================================ * */
1708OMX_ERRORTYPE testCase_3 (OMX_HANDLETYPE *pHandle)
1709{
1710    OMX_ERRORTYPE error = OMX_ErrorNone;
1711
1712    APP_STATEPRINT("\n\n*************** Pause command to Component *******************\n");
1713
1714#ifdef OMX_GETTIME
1715    GT_END("Call to SendCommand <OMX_StateExecuting>");
1716#endif
1717
1718    error = OMX_SendCommand (*pHandle, OMX_CommandStateSet, OMX_StatePause, NULL);
1719    if(error != OMX_ErrorNone) {
1720        fprintf (stderr,"Error from SendCommand-Pasue State function\n");
1721        return (error);
1722    }
1723    APP_STATEPRINT("*********** Waiting for state to change to Pause ************\n");
1724#ifdef OMX_GETTIME
1725    GT_START();
1726#endif
1727    error = WaitForState (pHandle, OMX_StatePause);
1728
1729    if(error != OMX_ErrorNone) {
1730        fprintf(stderr, "Error:  WaitForState reports an error %X\n", error);
1731        return (error);
1732    }
1733    APP_STATEPRINT("*********** State Changed to Pause ************\n\n");
1734
1735    printf("Sleeping for %d secs....\n\n",SLEEP_TIME);
1736    sleep(SLEEP_TIME);
1737
1738    APP_STATEPRINT("*************** Resume command to Component *******************\n");
1739#ifdef OMX_GETTIME
1740    GT_END("Call to SendCommand <OMX_StatePause>");
1741#endif
1742    error = OMX_SendCommand (*pHandle, OMX_CommandStateSet,OMX_StateExecuting, NULL);
1743    if(error != OMX_ErrorNone) {
1744        fprintf (stderr,"Error from SendCommand-Executing State function\n");
1745        return (error);
1746    }
1747
1748    APP_STATEPRINT("******** Waiting for state to change to Resume ************\n");
1749
1750#ifdef OMX_GETTIME
1751    GT_END("Call to SendCommand <OMX_StateExecuting>");
1752#endif
1753
1754    error = WaitForState (pHandle, OMX_StateExecuting);
1755    if(error != OMX_ErrorNone) {
1756        fprintf(stderr, "Error:  WaitForState reports an error %X\n", error);
1757        return (error);
1758    }
1759    APP_STATEPRINT("*********** State Changed to Resume ************\n\n");
1760
1761    return (error);
1762}
1763/* ================================================================================= * */
1764/**
1765 * @fn sendInBuffFillOutBuff() This is the main function of application which gets called.
1766 *
1767 */
1768/* ================================================================================ * */
1769OMX_ERRORTYPE sendInBuffFillOutBuff (OMX_HANDLETYPE *pHandle, int nIpBuffs, int nOpBuffs, int gDasfMode, OMX_BUFFERHEADERTYPE *pInputBufferHeader[],  FILE *fIn, OMX_BUFFERHEADERTYPE *pOutputBufferHeader[])
1770{
1771    int k = 0;
1772    OMX_ERRORTYPE error = OMX_ErrorNone;
1773
1774    for (k=0; k < nIpBuffs; k++) {
1775#ifdef OMX_GETTIME
1776        if (k == 0) {
1777            GT_FlagE=1;  /* 1 = First Buffer,  0 = Not First Buffer  */
1778            GT_START(); /* Empty Bufffer */
1779        }
1780#endif
1781        error = send_input_buffer (*pHandle, pInputBufferHeader[k], fIn);
1782        if(error != OMX_ErrorNone) {
1783            return (error);
1784        }
1785    }
1786    if (gDasfMode == 0) {
1787        for (k=0; k < nOpBuffs; k++) {
1788#ifdef OMX_GETTIME
1789            if (k == 0) {
1790                GT_FlagF=1;  /* 1 = First Buffer,  0 = Not First Buffer  */
1791                GT_START(); /* Fill Buffer */
1792            }
1793#endif
1794            error = OMX_FillThisBuffer (*pHandle, pOutputBufferHeader[k]);
1795            if(error != OMX_ErrorNone) {
1796                return (error);
1797            }
1798        }
1799    }
1800    return (error);
1801}
1802/* ================================================================================= * */
1803/**
1804 * @fn omxFreeBuffers() This is the main function of application which gets called.
1805 *
1806 */
1807/* ================================================================================ * */
1808OMX_ERRORTYPE omxFreeBuffers (OMX_HANDLETYPE *pHandle, int nBuffs, OMX_BUFFERHEADERTYPE *pBufferHeader  [], char *sBuffTypeMsg)
1809{
1810    int i = 0;
1811    OMX_ERRORTYPE error = OMX_ErrorNone;
1812
1813    for (i=0; i<nBuffs; i++) {
1814        APP_DPRINT("%d :: App: Freeing %p %s BufHeader\n",__LINE__,pBufferHeader[i], sBuffTypeMsg);
1815        error = OMX_FreeBuffer(*pHandle,OMX_DirInput,pBufferHeader[i]);
1816        if((error != OMX_ErrorNone)) {
1817            APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
1818            return (error);
1819        }
1820    }
1821
1822    return (error);
1823}
1824/* ================================================================================= * */
1825/**
1826 * @fn getString_OMX_State () This is the main function of application which gets called.
1827 *
1828 */
1829/* ================================================================================ * */
1830void getString_OMX_State (char *ptrString, OMX_STATETYPE state)
1831{
1832    switch (state) {
1833    case OMX_StateInvalid:
1834        strcpy (ptrString, "OMX_StateInvalid\0");
1835        break;
1836    case OMX_StateLoaded:
1837        strcpy (ptrString, "OMX_StateLoaded\0");
1838        break;
1839    case OMX_StateIdle:
1840        strcpy (ptrString, "OMX_StateIdle\0");
1841        break;
1842    case OMX_StateExecuting:
1843        strcpy (ptrString, "OMX_StateExecuting\0");
1844        break;
1845    case OMX_StatePause:
1846        strcpy (ptrString, "OMX_StatePause\0");
1847        break;
1848    case OMX_StateWaitForResources:
1849        strcpy (ptrString, "OMX_StateWaitForResources\0");
1850        break;
1851    case OMX_StateMax:
1852        strcpy (ptrString, "OMX_StateMax\0");
1853        break;
1854    default:
1855        strcpy (ptrString, "Unknown state\0");
1856        break;
1857
1858    }
1859    return;
1860}
1861