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 PcmEncTest.c
26*
27* This file implements Test for PCM encoder OMX Component, which is fully
28* compliant with the Khronos 1.0 specification.
29*
30* @path  $(CSLPATH)\
31*
32* @rev  1.0
33*/
34/* ----------------------------------------------------------------------------
35*!
36*! Revision History
37*! ===================================
38*! 24-Jan-2006 rg:  Initial Version. Change required per OMAPSWxxxxxxxxx
39*! to provide _________________.
40*!
41* ============================================================================= */
42
43#include <unistd.h>
44#include <stdlib.h>
45#include <sys/ioctl.h>
46#include <sys/select.h>
47#include <string.h>
48#include <stdio.h>
49#include <fcntl.h>
50#include <errno.h>
51#include <linux/vt.h>
52#include <signal.h>
53#include <sys/stat.h>
54#include <OMX_Index.h>
55#include <OMX_Types.h>
56#include <OMX_Component.h>
57#include <OMX_Core.h>
58#include <OMX_Audio.h>
59#include <TIDspOmx.h>
60#include <pthread.h>
61#include <stdio.h>
62#include <linux/soundcard.h>
63
64
65#ifdef OMX_GETTIME
66    #include "OMX_Common_Utils.h"
67    #include "OMX_GetTime.h"     /*Headers for Performance & measuremet    */
68#endif
69
70#define INPUT_WMADEC_BUFFER_SIZE 4096 * 4
71#define OUTPUT_WMADEC_BUFFER_SIZE 4096 * 10
72#define NUM_WMADEC_INPUT_BUFFERS 1
73#define NUM_WMADEC_OUTPUT_BUFFERS 1
74#define STRESS_TEST_INTERATIONS 20
75
76#define FIFO1 "/dev/fifo.1"
77#define FIFO2 "/dev/fifo.2"
78
79#define OMX_WMADEC_NonMIME 1
80#define MIME_HEADER_LEN 6
81#define WINDOW_PLAY_OFFSET 2
82#undef APP_DEBUG
83#undef APP_MEMCHECK
84#undef TWOINPUTBUFFERS
85#undef USE_BUFFER
86/*For timestamp and tickcount*/
87#undef APP_TIME_TIC_DEBUG
88/* This Macro turns On the logic to detec memory
89   leaks on the App. To debug the component,
90   WMADEC_MEMDEBUG must be defined.*/
91#undef APP_MEMDEBUG
92
93#ifdef APP_DEBUG
94    #define APP_DPRINT(...)    fprintf(stderr,__VA_ARGS__)
95#else
96    #define APP_DPRINT(...)
97#endif
98
99#ifdef APP_TIME_TIC_DEBUG
100	#define TIME_PRINT(...)		fprintf(stderr,__VA_ARGS__)
101	#define TICK_PRINT(...)		fprintf(stderr,__VA_ARGS__)
102#else
103	#define TIME_PRINT(...)     if(frameMode)fprintf(stderr,__VA_ARGS__)
104	#define TICK_PRINT(...)     if(frameMode)fprintf(stderr,__VA_ARGS__)
105#endif
106
107#ifdef APP_MEMDEBUG
108    void *arr[500];
109    int lines[500];
110    int bytes[500];
111    char file[500][50];
112    int r;
113    #define newmalloc(x) mymalloc(__LINE__,__FILE__,x)
114    #define newfree(z) myfree(z,__LINE__,__FILE__)
115    void * mymalloc(int line, char *s, int size);
116    int myfree(void *dp, int line, char *s);
117#else
118    #define newmalloc(x) malloc(x)
119    #define newfree(z) free(z)
120#endif
121
122#ifdef APP_MEMCHECK
123    #define APP_MEMPRINT(...)    fprintf(stderr,__VA_ARGS__)
124#else
125    #define APP_MEMPRINT(...)
126#endif
127
128/* Borrowed from http://www.dtek.chalmers.se/groups/dvd/dist/oss_audio.c */
129/* AFMT_AC3 is really IEC61937 / IEC60958, mpeg/ac3/dts over spdif */
130#ifndef AFMT_AC3
131#define AFMT_AC3        0x00000400  /* Dolby Digital AC3 */
132#endif
133#ifndef AFMT_S32_LE
134#define AFMT_S32_LE     0x00001000  /* 32/24-bits, in 24bit use the msbs */
135#endif
136#ifndef AFMT_S32_BE
137#define AFMT_S32_BE     0x00002000  /* 32/24-bits, in 24bit use the msbs */
138#endif
139
140/* ======================================================================= */
141/**
142 *      Global variales declaration
143 */
144/* ======================================================================= */
145#ifdef OMX_GETTIME
146  OMX_ERRORTYPE eError = OMX_ErrorNone;
147  int GT_FlagE = 0;  /* Fill Buffer 1 = First Buffer,  0 = Not First Buffer  */
148  int GT_FlagF = 0;  /*Empty Buffer  1 = First Buffer,  0 = Not First Buffer  */
149  static OMX_NODE* pListHead = NULL;
150#endif
151
152FILE *fpRes;
153static OMX_BOOL bInvalidState;
154void* ArrayOfPointers[6];
155
156pthread_mutex_t WaitForState_mutex;
157pthread_cond_t  WaitForState_threshold;
158OMX_U8          WaitForState_flag;
159OMX_U8		TargetedState;
160
161int wmadecfdwrite;
162int wmadecfdread;
163
164/*AM_COMMANDDATATYPE cmd_data;*/
165
166int gMimeFlag = 0;
167int gStateNotifi = 0;
168int gState;
169int lastBufferSent = 0;
170static int  playCompleted = 0;
171int sampleRateChange = 0;
172
173fd_set rfds;
174int done = 0;
175int whileloopdone = 0;
176int frameMode = 0;
177/******************************************************************************/
178OMX_S16 numInputBuffers = 0;
179OMX_S16 numOutputBuffers = 0;
180#ifdef USE_BUFFER
181    OMX_U8* pInputBuffer[10];
182    OMX_U8* pOutputBuffer[10];
183#endif
184
185OMX_BUFFERHEADERTYPE* pInputBufferHeader[10];
186OMX_BUFFERHEADERTYPE* pOutputBufferHeader[10];
187
188/*FILE *fIn=NULL;
189int timeToExit = 0;*/
190/* RM control */
191int preempted = 0;
192int Event_Pipe[2];
193/******************************************************************************/
194
195/* ======================================================================= */
196/**
197 *      Enumered Types
198 */
199/* ======================================================================= */
200typedef enum COMPONENTS {
201    COMP_1,
202    COMP_2
203}COMPONENTS;
204
205enum
206{
207    NEXT_BITRATE_UNCHANGED = 0,
208    NEXT_BITRATE_CHANGED
209};
210
211typedef enum
212{
213    MIME_NO_SUPPORT = 0,
214    MIME_SUPPORTED
215}MIME_Settings;
216
217
218/* ======================================================================= */
219/**
220 *      Function Declaration
221 */
222/* ======================================================================= */
223
224int GetInfoFromBufferHeader(unsigned char **pBufPtr, int *pCurBitRate,
225                                                int *pNextBitRateFlag);
226
227void ResetBufferPointers(unsigned char **pBuffer);
228int maxint(int a, int b);
229
230int fill_data (OMX_BUFFERHEADERTYPE *pBuf, FILE *fIn);
231int fill_data_tc7 (OMX_BUFFERHEADERTYPE *pBuf, FILE *fIn);
232int unParse_Header (OMX_U8* pBuffer, FILE *fIn, int * payload);
233void ConfigureAudio();
234
235OMX_STRING strWmaEncoder = "OMX.TI.WMA.decode";
236int IpBuf_Pipe[2];
237int OpBuf_Pipe[2];
238OMX_ERRORTYPE StopComponent(OMX_HANDLETYPE *pHandle);
239OMX_ERRORTYPE send_input_buffer (OMX_HANDLETYPE pHandle, OMX_BUFFERHEADERTYPE* pBuffer, FILE *fIn);
240OMX_ERRORTYPE send_input_buffer_tc7 (OMX_HANDLETYPE pHandle, OMX_BUFFERHEADERTYPE* pBuffer, FILE *fIn);
241void fill_init_params(OMX_HANDLETYPE pHandle,const char * filename, int dasfmode, TI_OMX_DATAPATH * dataPath);
242float calc_buff_size(FILE *fIn);
243int FreeAllResources( OMX_HANDLETYPE pHandle,
244			                OMX_BUFFERHEADERTYPE* pBufferIn,
245			                OMX_BUFFERHEADERTYPE* pBufferOut,
246			                int NIB, int NOB,
247			                FILE* fIn, FILE* fOut);
248
249#ifdef USE_BUFFER
250int  freeAllUseResources(OMX_HANDLETYPE pHandle,
251						  OMX_U8* UseInpBuf[],
252						  OMX_U8* UseOutBuf[],
253						  int NIB, int NOB,
254						  FILE* fIn, FILE* fOut);
255
256#endif
257
258/* safe routine to get the maximum of 2 integers */
259int maxint(int a, int b)
260{
261         return (a>b) ? a : b;
262}
263
264/* This method will wait for the component to get to the state
265 * specified by the DesiredState input. */
266static OMX_ERRORTYPE WaitForState(OMX_HANDLETYPE* pHandle,
267                                  OMX_STATETYPE DesiredState)
268{
269     OMX_STATETYPE CurState = OMX_StateInvalid;
270     OMX_ERRORTYPE eError1 = OMX_ErrorNone;
271     /*int nCnt = 0;*/
272     OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)pHandle;
273     eError1 = pComponent->GetState(pHandle, &CurState);
274	 if (CurState == OMX_StateInvalid && bInvalidState == OMX_TRUE)
275	 {
276		 	eError1 = OMX_ErrorInvalidState;
277	 }
278 	if( (eError1 == OMX_ErrorNone) &&
279            (CurState != DesiredState) )
280    {
281        APP_DPRINT( "%d :: App: WaitForState\n", __LINE__);
282        WaitForState_flag = 1;
283        TargetedState = DesiredState;
284        pthread_mutex_lock(&WaitForState_mutex);
285        pthread_cond_wait(&WaitForState_threshold, &WaitForState_mutex);/*Going to sleep till signal arrives*/
286        pthread_mutex_unlock(&WaitForState_mutex);
287        APP_DPRINT( "%d :: App: WaitForState\n", __LINE__);
288
289     }
290     if( eError1 != OMX_ErrorNone ) return eError1;
291     return OMX_ErrorNone;
292}
293
294
295/* ================================================================================= */
296/**
297* @fn EventHandler() description for SendCommand
298EventHandler().
299App event handler
300*
301*  @see         OMX_Core.h
302*/
303/* ================================================================================ */
304OMX_ERRORTYPE EventHandler(OMX_HANDLETYPE hComponent, OMX_PTR pAppData,
305							OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2,
306							OMX_PTR pEventData)
307{
308   OMX_U8 writeValue;
309
310   OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)hComponent;
311   OMX_STATETYPE state;
312   OMX_ERRORTYPE eError1;
313
314#ifdef APP_DEBUG
315   int iComp = *((int *)(pAppData));
316#endif
317   eError1 = pComponent->GetState (hComponent, &state);
318
319   if(eError1 != OMX_ErrorNone) {
320       APP_DPRINT("%d :: App: Error returned from GetState\n",__LINE__);
321   }
322
323   switch (eEvent) {
324       case OMX_EventCmdComplete:
325			if (nData1 == OMX_CommandPortDisable) {
326				if (nData2 == OMX_DirInput) {
327					APP_DPRINT ( "%d Component State Changed To %d\n", __LINE__,state);
328				}
329				if (nData2 == OMX_DirOutput) {
330					APP_DPRINT ( "%d Component State Changed To %d\n", __LINE__,state);
331				}
332			}
333
334            if ((nData1 == OMX_CommandStateSet) &&
335				(TargetedState == nData2) && (WaitForState_flag))
336            {
337                APP_DPRINT( "%d :: App: Component State Changed To %d\n", __LINE__,state);
338                WaitForState_flag = 0;
339                pthread_mutex_lock(&WaitForState_mutex);
340                /*Sending Waking Up Signal*/
341                pthread_cond_signal(&WaitForState_threshold);
342                pthread_mutex_unlock(&WaitForState_mutex);
343            }
344            APP_DPRINT( "%d :: App: Component State Changed To %d\n", __LINE__,state);
345            break;
346		case OMX_EventResourcesAcquired:
347	        writeValue = 1;
348	        preempted = 0;
349	        write(Event_Pipe[1], &writeValue, sizeof(OMX_U8));
350	        break;
351
352       case OMX_EventError:
353           if (nData1 != OMX_ErrorNone) {
354
355		           }
356        else if(nData1 == OMX_ErrorResourcesPreempted) {
357            writeValue = 0;
358            preempted = 1;
359            write(Event_Pipe[1], &writeValue, sizeof(OMX_U8));
360        }
361        else if (nData1 == OMX_ErrorResourcesLost) {
362            WaitForState_flag = 0;
363            pthread_mutex_lock(&WaitForState_mutex);
364            pthread_cond_signal(&WaitForState_threshold);
365            pthread_mutex_unlock(&WaitForState_mutex);
366
367           }
368	   if (nData1 == OMX_ErrorInvalidState) {
369	   		bInvalidState =OMX_TRUE;
370	   }
371           break;
372       case OMX_EventMax:
373           break;
374       case OMX_EventMark:
375           break;
376		case OMX_EventBufferFlag:
377			APP_DPRINT( "%d :: App: EOS Event Received\n", __LINE__);
378            if((int)pEventData == OMX_BUFFERFLAG_EOS)
379            {
380                playCompleted = 1;
381				writeValue = 2;
382				write(Event_Pipe[1], &writeValue, sizeof(OMX_U8));
383            }
384			if(nData2 == (OMX_U32)OMX_BUFFERFLAG_EOS) {
385				if(nData1 == (OMX_U32)NULL)
386					puts("IN Buffer flag received!");
387				else if(nData1 == (OMX_U32)NULL)
388					puts("OUT Buffer flag received!");
389			}
390			break;
391       default:
392           break;
393   }
394    return eError1;
395}
396
397
398/* ================================================================================= */
399/**
400* @fn FillBufferDone() description for FillBufferDone
401FillBufferDone().
402Called by the component when an output buffer has been filled
403*
404*  @see         OMX_Core.h
405*/
406/* ================================================================================ */
407void FillBufferDone (OMX_HANDLETYPE hComponent, OMX_PTR ptr, OMX_BUFFERHEADERTYPE* pBuffer)
408{
409    APP_DPRINT("APP:::: OUTPUT BUFFER = %p && %p, pBuffer->nFilledLen = %d\n",
410            pBuffer, pBuffer->pBuffer, pBuffer->nFilledLen);
411    /*add on: TimeStamp & TickCount EmptyBufferDone*/
412    TIME_PRINT("TimeStamp Output: %lld\n",pBuffer->nTimeStamp);
413    TICK_PRINT("TickCount Output: %ld\n\n",pBuffer->nTickCount);
414    write(OpBuf_Pipe[1], &pBuffer, sizeof(pBuffer));
415    #ifdef OMX_GETTIME
416      if (GT_FlagF == 1 ) /* First Buffer Reply*/  /* 1 = First Buffer,  0 = Not First Buffer  */
417      {
418        GT_END("Call to FillBufferDone  <First: FillBufferDone>");
419        GT_FlagF = 0 ;   /* 1 = First Buffer,  0 = Not First Buffer  */
420      }
421    #endif
422}
423
424/* ================================================================================= */
425/**
426* @fn EmptyBufferDone() description for EmptyBufferDone
427EmptyBufferDone().
428Called by the component when an input buffer has been emptied
429*
430*  @see         OMX_Core.h
431*/
432/* ================================================================================ */
433void EmptyBufferDone(OMX_HANDLETYPE hComponent, OMX_PTR ptr, OMX_BUFFERHEADERTYPE* pBuffer)
434{
435    APP_DPRINT ("APP:::: INPUT BUFFER = %p && %p\n",pBuffer, pBuffer->pBuffer);
436    APP_DPRINT("EmptyBufferDone\n");
437	if (!preempted)
438    write(IpBuf_Pipe[1], &pBuffer, sizeof(pBuffer));
439    #ifdef OMX_GETTIME
440      if (GT_FlagE == 1 ) /* First Buffer Reply*/  /* 1 = First Buffer,  0 = Not First Buffer  */
441      {
442        GT_END("Call to EmptyBufferDone <First: EmptyBufferDone>");
443       GT_FlagE = 0;   /* 1 = First Buffer,  0 = Not First Buffer  */
444      }
445   #endif
446
447 }
448
449/* ================================================================================= */
450/**
451* @fn main() description for main
452main().
453Test app main function
454*
455*  @see         OMX_Core.h
456*/
457/* ================================================================================ */
458int main(int argc, char* argv[])
459{
460
461printf("\n*************************************************************************    \n*********** Entering to the WMA DEC TEST APP\n **************************************************************************\n");
462    OMX_CALLBACKTYPE WmaCaBa = {(void *)EventHandler,
463                (void*)EmptyBufferDone,
464                                (void*)FillBufferDone};
465    OMX_HANDLETYPE pHandle;
466    OMX_ERRORTYPE error = OMX_ErrorNone;
467    OMX_U32 AppData = 100;
468    OMX_PARAM_PORTDEFINITIONTYPE* pCompPrivateStruct;
469    OMX_AUDIO_PARAM_WMATYPE *pWmaParam;
470    OMX_COMPONENTTYPE *pComponent_dasf;
471	OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)pHandle;
472    OMX_STATETYPE state;
473    /* TODO: Set a max number of buffers */
474    OMX_BUFFERHEADERTYPE* pInputBufferHeader[10];
475    /* TODO: Set a max number of buffers */
476    OMX_BUFFERHEADERTYPE* pOutputBufferHeader[10];
477	/*OMX_U32 count = 0;*/
478    /*OMX_U32 fdmax = 0;*/
479
480	FILE *fOut = NULL, *fIn = NULL;
481
482	bInvalidState=OMX_FALSE;
483    TI_OMX_DATAPATH dataPath;
484	OMX_INDEXTYPE index;
485
486    int k;
487    OMX_STATETYPE curState;
488
489    int numInputBuffers = 0;
490    int numOutputBuffers = 0;
491    struct timeval tv;
492    int retval, i, j;
493    int frmCount = 0;
494    int frmCnt = 1;
495    int testcnt = 1;
496    int testcnt1 = 1;
497    int dasfmode = 0;
498    int stress = 0;
499    OMX_U64 outBuffSize;
500    char fname[15] = "output";
501
502    pthread_mutex_init(&WaitForState_mutex, NULL);
503    pthread_cond_init (&WaitForState_threshold, NULL);
504    WaitForState_flag = 0;
505
506    APP_DPRINT("------------------------------------------------------\n");
507    APP_DPRINT("This is Main Thread In WMA DECODER Test Application:\n");
508    APP_DPRINT("Test Core 1.5 - " __DATE__ ":" __TIME__ "\n");
509    APP_DPRINT("------------------------------------------------------\n");
510
511#ifdef OMX_GETTIME
512    printf("Line %d\n",__LINE__);
513      eError = OMX_ListCreate(&pListHead);
514        printf("Line %d\n",__LINE__);
515      printf("eError = %d\n",eError);
516      GT_START();
517  printf("Line %d\n",__LINE__);
518#endif
519
520    /* check the input parameters */
521    if(!(argc == 7 || argc == 8))  {
522        printf( "Usage: test infile [outfile] args. Wrong Arguments: See Example Below\n");
523        printf( "./WmaDecTest_common test1_wma_v8_5kbps_8khz_1.rca test1_wma_v8_5kbps_8khz_1.WMA 1 0 1 1\n");
524        goto EXIT;
525    }
526    numInputBuffers = atoi(argv[5]);
527    numOutputBuffers = atoi(argv[6]);
528    if(numInputBuffers > 4 && numInputBuffers < 1)
529    {
530        APP_DPRINT( "Cannot support %u Input buffers\n", numInputBuffers);
531        goto EXIT;
532    }
533    if(numOutputBuffers > 4 && numOutputBuffers < 0)
534    {
535        APP_DPRINT( "Cannot support %u Output buffers\n", numOutputBuffers);
536        goto EXIT;
537    }
538
539	if( argv[7] != NULL  )
540	{
541        if(!strcmp(argv[7], "FRAME"))
542        {
543            frameMode = 1;
544            printf("******** Frame mode selected *********\n");
545        }
546        else
547        {
548            stress = atoi(argv[7]);
549        }
550	}
551
552    /* check to see that the input file exists */
553    struct stat sb = {0};
554    int status = stat(argv[1], &sb);
555    if( status != 0 ) {
556        APP_DPRINT( "Cannot find file %s. (%u)\n", argv[1], errno);
557        goto EXIT;
558    }
559    APP_DPRINT("%d :: WmaTest\n",__LINE__);
560    dasfmode = atoi(argv[4]);
561    if(dasfmode == 1){
562        printf("DASF MODE\n");
563    }
564    else if(dasfmode == 0){
565		printf("NON DASF MODE\n");
566    }
567    else {
568        printf("Enter proper DASF mode\n");
569        printf("DASF:1\n");
570        printf("NON DASF:0\n");
571        goto EXIT;
572    }
573    /* Open the file of data to be rendered. */
574    fIn = fopen(argv[1], "r");
575    if( fIn == NULL ) {
576        APP_DPRINT( "Error:  failed to open the file %s for readonly\access\n", argv[1]);
577        goto EXIT;
578    }
579
580    fOut = fopen(argv[2], "w");
581    if( fOut == NULL ) {
582        APP_DPRINT( "Error:  failed to create the output file %s\n", argv[2]);
583        goto EXIT;
584    }
585
586    /* Create a pipe used to queue data from the callback. */
587    retval = pipe(IpBuf_Pipe);
588    if( retval != 0) {
589        APP_DPRINT( "Error:Fill Data Pipe failed to open\n");
590        goto EXIT;
591    }
592
593    retval = pipe(OpBuf_Pipe);
594    if( retval != 0) {
595        APP_DPRINT( "Error:Empty Data Pipe failed to open\n");
596        goto EXIT;
597    }
598		retval = pipe(Event_Pipe);
599    if( retval != 0) {
600        APP_DPRINT( "%d [WMADECTEST] Error: Empty Data Pipe failed to open\n",__LINE__);
601        goto EXIT;
602    }
603
604    /* save off the "max" of the handles for the selct statement */
605    int fdmax = maxint(IpBuf_Pipe[0], OpBuf_Pipe[0]);
606
607    APP_DPRINT("%d :: WmaTest\n",__LINE__);
608    error = TIOMX_Init();
609    APP_DPRINT("%d :: WmaTest\n",__LINE__);
610    if(error != OMX_ErrorNone) {
611        APP_DPRINT("%d :: Error returned by TIOMX_Init()\n",__LINE__);
612        goto EXIT;
613    }
614
615    APP_DPRINT("%d :: WmaTest\n",__LINE__);
616    switch (atoi(argv[3])) {
617        case 1:
618               printf ("-------------------------------------\n");
619               printf ("Testing Simple PLAY till EOF \n");
620               printf ("-------------------------------------\n");
621               break;
622        case 2:
623               printf ("-------------------------------------\n");
624               printf ("Testing Stop and Play \n");
625               printf ("-------------------------------------\n");
626               strcat(fname,"_tc2.pcm");
627               testcnt = 2;
628               break;
629        case 3:
630               printf ("-------------------------------------\n");
631               printf ("Testing PAUSE & RESUME Command\n");
632               printf ("-------------------------------------\n");
633               break;
634        case 4:
635               printf ("---------------------------------------------\n");
636               printf ("Testing STOP Command by Stopping In-Between\n");
637               printf ("---------------------------------------------\n");
638               break;
639        case 5:
640               printf ("-------------------------------------------------\n");
641               printf ("Testing Repeated PLAY without Deleting Component\n");
642               printf ("-------------------------------------------------\n");
643               strcat(fname,"_tc5.pcm");
644				if (stress)
645				{
646					testcnt = 100;
647					printf("******   Stress testing selected, running 100 iterations   ******\n");
648				}
649				else
650				{
651					testcnt = STRESS_TEST_INTERATIONS;
652				}
653               break;
654        case 6:
655               printf ("------------------------------------------------\n");
656               printf ("Testing Repeated PLAY with Deleting Component\n");
657               printf ("------------------------------------------------\n");
658               strcat(fname,"_tc6.pcm");
659			   	if (stress)
660				{
661					testcnt1 = 100;
662					printf("******   Stress testing selected, running 100 iterations   ******\n");
663				}
664				else
665				{
666					testcnt1 = STRESS_TEST_INTERATIONS;
667				}
668               break;
669        case 7:
670               printf ("------------------------------------------------\n");
671               printf ("Testing Window Play\n");
672               printf ("------------------------------------------------\n");
673               strcat(fname,"_tc6.pcm");
674               break;
675        case 8:
676            printf ("------------------------------------------------\n");
677            printf ("Testing Power Management\n");
678            printf ("------------------------------------------------\n");
679            sampleRateChange = 1;
680            break;
681		case 9:
682		   printf ("------------------------------------------------------------\n");
683		   printf ("Testing Ringtone test\n");
684		   printf ("------------------------------------------------------------\n");
685		   strcat(fname,"_tc9.pcm");
686		   testcnt = 10;
687		   break;
688    }
689
690    APP_DPRINT("%d :: WmaTest\n",__LINE__);
691        dasfmode = atoi(argv[4]);
692        if(dasfmode == 1){
693            printf("DASF MODE\n");
694        }
695        else if(dasfmode == 0){
696			printf("NON DASF MODE\n");
697        }
698        else {
699            printf("Enter proper DASF mode\n");
700            printf("DASF:1\n");
701            printf("NON DASF:0\n");
702            goto EXIT;
703        }
704
705    APP_DPRINT("%d :: WmaTest\n",__LINE__);
706    for(j = 0; j < testcnt1; j++) {
707        whileloopdone = 0;
708        if(j > 0) {
709            printf ("=Decoding the file %d Time\n",j+1);
710            close(IpBuf_Pipe[0]);
711            close(IpBuf_Pipe[1]);
712            close(OpBuf_Pipe[0]);
713            close(OpBuf_Pipe[1]);
714			close(Event_Pipe[0]);
715            close(Event_Pipe[1]);
716
717            /* Create a pipe used to queue data from the callback. */
718            retval = pipe(IpBuf_Pipe);
719            if( retval != 0) {
720                APP_DPRINT( "Error:Fill Data Pipe failed to open\n");
721                goto EXIT;
722            }
723            retval = pipe(OpBuf_Pipe);
724            if( retval != 0) {
725                APP_DPRINT( "Error:Empty Data Pipe failed to open\n");
726                goto EXIT;
727            }
728			retval = pipe(Event_Pipe);
729            if( retval != 0) {
730                APP_DPRINT( "%d [GSMFRTEST] Error:Empty Data Pipe failed to open\n",__LINE__);
731                goto EXIT;
732            }
733            fIn = fopen(argv[1], "r");
734            if( fIn == NULL ) {
735                fprintf(stderr, "Error:  failed to open the file %s for readonly\
736                                                                   access\n", argv[1]);
737                goto EXIT;
738            }
739            fOut = fopen(fname, "w");
740            if( fOut == NULL ) {
741                fprintf(stderr, "Error:  failed to create the output file \n");
742                goto EXIT;
743            }
744            error = TIOMX_Init();
745			if(error != OMX_ErrorNone) {
746			APP_DPRINT("%d [GSMFRTEST] Error returned by OMX_Init()\n",__LINE__);
747            goto EXIT;
748            }
749         }
750
751#ifdef DSP_RENDERING_ON
752        if((wmadecfdwrite=open(FIFO1,O_WRONLY))<0)
753        {
754            printf("[WmaTEST] - failure to open WRITE pipe\n");
755        }
756        else
757        {
758            printf("[WmaTEST] - opened WRITE pipe\n");
759        }
760        if((wmadecfdread=open(FIFO2,O_RDONLY))<0)
761        {
762            printf("[WmaTEST] - failure to open READ pipe\n");
763            goto EXIT;
764        }
765        else
766        {
767            printf("[WmaTEST] - opened READ pipe\n");
768        }
769#endif
770    /* Load the WMA Encoder Component */
771    APP_DPRINT("%d :: WmaTest\n",__LINE__);
772#ifdef OMX_GETTIME
773  GT_START();
774    error = TIOMX_GetHandle(&pHandle, strWmaEncoder, &AppData, &WmaCaBa);
775  GT_END("Call to GetHandle");
776#else
777    error = TIOMX_GetHandle(&pHandle, strWmaEncoder, &AppData, &WmaCaBa);
778#endif
779
780    APP_DPRINT("%d :: WmaTest\n",__LINE__);
781    if((error != OMX_ErrorNone) || (pHandle == NULL)) {
782        APP_DPRINT ("Error in Get Handle function\n");
783        goto EXIT;
784    }
785
786    APP_DPRINT("%d :: WmaTest\n",__LINE__);
787    pCompPrivateStruct = newmalloc (sizeof (OMX_PARAM_PORTDEFINITIONTYPE));
788    ArrayOfPointers[0]=(OMX_PARAM_PORTDEFINITIONTYPE*)pCompPrivateStruct;
789    APP_MEMPRINT("%d:::[TESTAPPALLOC] %p\n",__LINE__,pCompPrivateStruct);
790
791    APP_DPRINT("%d :: WmaTest\n",__LINE__);
792    pCompPrivateStruct->nSize = sizeof (OMX_PARAM_PORTDEFINITIONTYPE);
793    pCompPrivateStruct->nVersion.s.nVersionMajor = 0xF1;
794    pCompPrivateStruct->nVersion.s.nVersionMinor = 0xF2;
795    APP_DPRINT("%d :: WmaTest\n",__LINE__);
796
797    /* Send input port config */
798    pCompPrivateStruct->nPortIndex = OMX_DirInput;
799    pCompPrivateStruct->format.audio.cMIMEType = newmalloc(20);
800    ArrayOfPointers[1]=pCompPrivateStruct->format.audio.cMIMEType;
801    APP_MEMPRINT("%d:::[TESTAPPALLOC] %p\n",__LINE__,pCompPrivateStruct->format.audio.cMIMEType);
802
803#ifndef USE_BUFFER
804    APP_DPRINT("%d :: About to call OMX_AllocateBuffer\n",__LINE__);
805    for (i=0; i < numInputBuffers; i++) {
806    /* allocate input buffer */
807    APP_DPRINT("%d :: About to call OMX_AllocateBuffer\n",__LINE__);
808    error = OMX_AllocateBuffer(pHandle,&pInputBufferHeader[i],0,NULL,INPUT_WMADEC_BUFFER_SIZE);
809    APP_DPRINT("%d :: called OMX_AllocateBuffer\n",__LINE__);
810		if(error != OMX_ErrorNone) {
811			APP_DPRINT("%d :: Error returned by OMX_AllocateBuffer()\n",__LINE__);
812        goto EXIT;
813		}
814
815    }
816
817    if (frameMode)
818    {
819        outBuffSize = calc_buff_size(fIn);
820        APP_DPRINT("%d :: outBuffSize %lld\n", outBuffSize, __LINE__);
821        fclose(fIn);
822        fIn = fopen(argv[1], "r");
823        if(fIn == NULL) {
824            fprintf(stderr, "Error:  failed to open the file %s for readonly access\n", argv[1]);
825            goto EXIT;
826        }
827    }
828    else if (dasfmode == 1)
829    {
830        outBuffSize = 4096 * 2 * 2;
831    }
832    else
833    {
834        outBuffSize = OUTPUT_WMADEC_BUFFER_SIZE;
835    }
836    for (i=0; i < numOutputBuffers; i++) {
837        /* allocate output buffer */
838        APP_DPRINT("%d :: About to call OMX_AllocateBuffer\n",__LINE__);
839        error = OMX_AllocateBuffer(pHandle,&pOutputBufferHeader[i],1,NULL,outBuffSize);
840        APP_DPRINT("%d :: called OMX_AllocateBuffer\n",__LINE__);
841        if(error != OMX_ErrorNone) {
842            APP_DPRINT("%d :: Error returned by OMX_AllocateBuffer()\n",__LINE__);
843            goto EXIT;
844        }
845    }
846#else
847    OMX_U8* pInputBuffer;
848    OMX_U8* pOutputBuffer;
849
850
851    APP_DPRINT("%d :: About to call OMX_UseBuffer\n",__LINE__);
852
853
854    pOutputBuffer= newmalloc (OUTPUT_WMADEC_BUFFER_SIZE + 256);
855    APP_MEMPRINT("%d:::[TESTAPPALLOC] %p\n",__LINE__,pOutputBuffer);
856    pOutputBuffer = pOutputBuffer + 128;
857    pInputBuffer = (OMX_U8*)newmalloc(INPUT_WMADEC_BUFFER_SIZE);
858    APP_MEMPRINT("%d:::[TESTAPPALLOC] %p\n",__LINE__,pInputBuffer);
859
860    /* allocate input buffer */
861    APP_DPRINT("%d :: About to call OMX_UseBuffer\n",__LINE__);
862    error = OMX_UseBuffer(pHandle,&pInputBufferHeader,0,NULL,INPUT_WMADEC_BUFFER_SIZE,pInputBuffer);
863    APP_DPRINT("%d :: called OMX_UseBuffer\n",__LINE__);
864    if(error != OMX_ErrorNone) {
865        APP_DPRINT("%d :: Error returned by OMX_UseBuffer()\n",__LINE__);
866        goto EXIT;
867    }
868
869    if (frameMode)
870    {
871        outBuffSize = calc_buff_size(fIn);
872        printf("%d :: outBuffSize %d\n", outBuffSize, __LINE__);
873        fclose(fIn);
874        fIn = fopen(argv[1], "r");
875        if(fIn == NULL) {
876            fprintf(stderr, "Error:  failed to open the file %s for readonly access\n", argv[1]);
877            goto EXIT;
878        }
879    }
880    else
881    {
882        outBuffSize = OUTPUT_WMADEC_BUFFER_SIZE;
883    }
884
885    /* allocate output buffer */
886    APP_DPRINT("%d :: About to call OMX_UseBuffer\n",__LINE__);
887    error = OMX_UseBuffer(pHandle,&pOutputBufferHeader,1,NULL,outBuffSize,pOutputBuffer);
888    APP_DPRINT("%d :: called OMX_UseBuffer\n",__LINE__);
889    if(error != OMX_ErrorNone) {
890        APP_DPRINT("%d :: Error returned by OMX_UseBuffer()\n",__LINE__);
891        goto EXIT;
892    }
893
894#endif
895    pCompPrivateStruct->nPortIndex = OMX_DirInput;
896    pCompPrivateStruct->eDir = OMX_DirInput;
897    pCompPrivateStruct->nBufferCountActual = NUM_WMADEC_INPUT_BUFFERS;
898    pCompPrivateStruct->nBufferSize = INPUT_WMADEC_BUFFER_SIZE;
899    pCompPrivateStruct->format.audio.eEncoding = OMX_AUDIO_CodingWMA;
900
901
902
903#ifdef OMX_GETTIME
904  GT_START();
905    error = OMX_SetParameter (pHandle,OMX_IndexParamAudioPortFormat, pCompPrivateStruct);
906  GT_END("Set Parameter Test-SetParameter");
907#else
908    error = OMX_SetParameter (pHandle,OMX_IndexParamAudioPortFormat, pCompPrivateStruct);
909#endif
910
911    if (error != OMX_ErrorNone) {
912        error = OMX_ErrorBadParameter;
913        printf ("%d:: OMX_ErrorBadParameter\n",__LINE__);
914        goto EXIT;
915    }
916
917    /* Send output port config */
918    pCompPrivateStruct->nPortIndex = OMX_DirOutput;
919    pCompPrivateStruct->eDir = OMX_DirOutput;
920    pCompPrivateStruct->nBufferCountActual = NUM_WMADEC_OUTPUT_BUFFERS;
921    pCompPrivateStruct->nBufferSize = outBuffSize;
922    pCompPrivateStruct->format.audio.eEncoding = OMX_AUDIO_CodingPCM;
923
924    if(dasfmode)
925    {
926		pCompPrivateStruct->nBufferCountActual = 0;
927    }
928
929#ifdef OMX_GETTIME
930  GT_START();
931    error = OMX_SetParameter (pHandle,OMX_IndexParamAudioPortFormat, pCompPrivateStruct);
932  GT_END("Set Parameter Test-SetParameter");
933#else
934    error = OMX_SetParameter (pHandle,OMX_IndexParamAudioPortFormat, pCompPrivateStruct);
935#endif
936
937    if (error != OMX_ErrorNone) {
938        error = OMX_ErrorBadParameter;
939        printf ("%d:: OMX_ErrorBadParameter\n",__LINE__);
940        goto EXIT;
941    }
942
943    pWmaParam = newmalloc (sizeof (OMX_AUDIO_PARAM_WMATYPE));
944    ArrayOfPointers[2]=(OMX_AUDIO_PARAM_WMATYPE*)pWmaParam;
945    APP_MEMPRINT("%d:::[TESTAPPALLOC] %p\n",__LINE__,pWmaParam);
946    pWmaParam->nSize = sizeof (OMX_AUDIO_PARAM_WMATYPE);
947    pWmaParam->nVersion.s.nVersionMajor = 0xF1;
948    pWmaParam->nVersion.s.nVersionMinor = 0xF2;
949    pWmaParam->nPortIndex = OMX_DirInput;
950    pWmaParam->nChannels = 1;
951    pWmaParam->nBitRate = 8000;
952    pWmaParam->eFormat = OMX_AUDIO_WMAFormat9;
953
954#ifdef OMX_GETTIME
955  GT_START();
956    error = OMX_SetParameter (pHandle,OMX_IndexParamAudioWma,pWmaParam);
957  GT_END("Set Parameter Test-SetParameter");
958#else
959    error = OMX_SetParameter (pHandle,OMX_IndexParamAudioWma,pWmaParam);
960#endif
961
962    if (error != OMX_ErrorNone) {
963        error = OMX_ErrorBadParameter;
964        printf ("%d:: OMX_ErrorBadParameter\n",__LINE__);
965        goto EXIT;
966    }
967
968    pWmaParam->nPortIndex = OMX_DirOutput;
969    pWmaParam->nChannels = 1;
970    pWmaParam->nBitRate = 8000;
971
972#ifdef OMX_GETTIME
973  GT_START();
974    error = OMX_SetParameter (pHandle,OMX_IndexParamAudioWma,pWmaParam);
975  GT_END("Set Parameter Test--SetParameter");
976#else
977    error = OMX_SetParameter (pHandle,OMX_IndexParamAudioWma,pWmaParam);
978#endif
979
980    if (error != OMX_ErrorNone) {
981        error = OMX_ErrorBadParameter;
982        printf ("%d:: OMX_ErrorBadParameter\n",__LINE__);
983        goto EXIT;
984    }
985
986    pComponent_dasf = (OMX_COMPONENTTYPE *)pHandle;
987
988    if (dasfmode)
989    {
990#ifdef RTM_PATH
991        dataPath = DATAPATH_APPLICATION_RTMIXER;
992#endif
993
994#ifdef ETEEDN_PATH
995        dataPath = DATAPATH_APPLICATION;
996#endif
997    }
998
999    fill_init_params(pHandle,argv[1],dasfmode,&dataPath);
1000
1001#ifdef OMX_GETTIME
1002  GT_START();
1003    error = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StateIdle, NULL);
1004  GT_END("Call to SendCommand <OMX_StateIdle>");
1005#else
1006    error = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StateIdle, NULL);
1007#endif
1008
1009    if(error != OMX_ErrorNone) {
1010        APP_DPRINT ("Error from SendCommand-Idle(Init) State function\n");
1011        goto EXIT;
1012    }
1013
1014    /* Wait for startup to complete */
1015    error = WaitForState(pHandle, OMX_StateIdle);
1016    if(error != OMX_ErrorNone) {
1017        APP_DPRINT( "Error:  hWmaEncoder->WaitForState reports an error %X\n", error);
1018        goto EXIT;
1019    }
1020
1021    if(dasfmode)
1022    {
1023	    /* get streamID back to application */
1024	    error = OMX_GetExtensionIndex(pHandle, "OMX.TI.index.config.wmastreamIDinfo",&index);
1025	    if (error != OMX_ErrorNone) {
1026		    printf("Error getting extension index\n");
1027		    goto EXIT;
1028	    }
1029    }
1030
1031    for(i = 0; i < testcnt; i++) {
1032            whileloopdone = 0;
1033        if(i > 0) {
1034            printf ("Decoding the file %d Time\n",i+1);
1035
1036            close(IpBuf_Pipe[0]);
1037            close(IpBuf_Pipe[1]);
1038            close(OpBuf_Pipe[0]);
1039            close(OpBuf_Pipe[1]);
1040
1041
1042            /* Create a pipe used to queue data from the callback. */
1043            retval = pipe(IpBuf_Pipe);
1044            if( retval != 0) {
1045                APP_DPRINT( "Error:Fill Data Pipe failed to open\n");
1046                goto EXIT;
1047            }
1048
1049            retval = pipe(OpBuf_Pipe);
1050            if( retval != 0) {
1051                APP_DPRINT( "Error:Empty Data Pipe failed to open\n");
1052                goto EXIT;
1053            }
1054            fIn = fopen(argv[1], "r");
1055            if(fIn == NULL) {
1056                fprintf(stderr, "Error:  failed to open the file %s for readonly access\n", argv[1]);
1057                goto EXIT;
1058            }
1059            fOut = fopen(fname, "w");
1060            if(fOut == NULL) {
1061                fprintf(stderr, "Error:  failed to create the output file \n");
1062                goto EXIT;
1063            }
1064        }
1065
1066        done = 0;
1067
1068		if (atoi(argv[3]) == 9){
1069			if(i==0){
1070				printf ("Basic Function:: Sending OMX_StateExecuting Command\n");
1071#ifdef OMX_GETTIME
1072				GT_START();
1073#endif
1074		        error = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StateExecuting, NULL);
1075		        if(error != OMX_ErrorNone) {
1076		            APP_DPRINT ("Error from SendCommand-Executing State function\n");
1077		            goto EXIT;
1078		        }
1079		        pComponent = (OMX_COMPONENTTYPE *)pHandle;
1080		        error = WaitForState(pHandle, OMX_StateExecuting);
1081#ifdef OMX_GETTIME
1082				GT_END("Call to SendCommand <OMX_StateExecuting>");
1083#endif
1084		        if(error != OMX_ErrorNone) {
1085		            APP_DPRINT( "Error:  hWmaEncoder->WaitForState reports an error %X\n", error);
1086		            goto EXIT;
1087		        }
1088			}
1089		}else{
1090	        printf ("Basic Function (else):: Sending OMX_StateExecuting Command\n");
1091#ifdef OMX_GETTIME
1092	      GT_START();
1093#endif
1094	        error = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StateExecuting, NULL);
1095	        if(error != OMX_ErrorNone) {
1096	            APP_DPRINT ("Error from SendCommand-Executing State function\n");
1097	            goto EXIT;
1098	        }
1099	        pComponent = (OMX_COMPONENTTYPE *)pHandle;
1100	        error = WaitForState(pHandle, OMX_StateExecuting);
1101#ifdef OMX_GETTIME
1102			GT_END("Call to SendCommand <OMX_StateExecuting>");
1103#endif
1104	        if(error != OMX_ErrorNone) {
1105	            APP_DPRINT( "Error:  hWmaEncoder->WaitForState reports an error %X\n", error);
1106	            goto EXIT;
1107	        }
1108		}
1109
1110        if (atoi(argv[3]) == 7) {
1111	        for (k=0; k < numInputBuffers; k++) {
1112#ifdef OMX_GETTIME
1113	             if (k==0)
1114	              {
1115	                GT_FlagE=1;  /* 1 = First Buffer,  0 = Not First Buffer  */
1116	                GT_START(); /* Empty Bufffer */
1117	              }
1118#endif
1119	            error = send_input_buffer_tc7 (pHandle, pInputBufferHeader[k], fIn);
1120	        }
1121        }
1122        else {
1123			for (k=0; k < numInputBuffers; k++) {
1124#ifdef OMX_GETTIME
1125				if (k==0)
1126				{
1127	                GT_FlagE=1;  /* 1 = First Buffer,  0 = Not First Buffer  */
1128	                GT_START(); /* Empty Bufffer */
1129				}
1130#endif
1131				error = send_input_buffer (pHandle, pInputBufferHeader[k], fIn);
1132			}
1133        }
1134        if (dasfmode == 0)
1135        {
1136            for (k=0; k < numOutputBuffers; k++) {
1137#ifdef OMX_GETTIME
1138	            if (k==0)
1139	            {
1140	                GT_FlagF=1;  /* 1 = First Buffer,  0 = Not First Buffer  */
1141	                GT_START(); /* Fill Buffer */
1142	            }
1143#endif
1144                pComponent->FillThisBuffer(pHandle,  pOutputBufferHeader[k]);
1145            }
1146        }
1147
1148        if(sampleRateChange) {
1149        /*
1150            cmd_data.hComponent = pHandle;
1151            cmd_data.AM_Cmd = AM_CommandWarnSampleFreqChange;
1152            cmd_data.param1 = 44100;*/
1153#ifdef DSP_RENDERING_ON
1154            if((write(wmadecfdwrite, &cmd_data, sizeof(cmd_data)))<0) {
1155                printf("send command to audio manager\n");
1156            }
1157#endif
1158        }
1159        OMX_GetState(pHandle,&curState);
1160
1161        while((error == OMX_ErrorNone && curState != OMX_StateIdle )
1162				&& curState != OMX_StateInvalid) {
1163
1164            FD_ZERO(&rfds);
1165            FD_SET(IpBuf_Pipe[0], &rfds);
1166            FD_SET(OpBuf_Pipe[0], &rfds);
1167            tv.tv_sec = 1;
1168            tv.tv_usec = 0;
1169            frmCount++;
1170            retval = select(fdmax+1, &rfds, NULL, NULL, &tv);
1171
1172            if(retval == -1) {
1173                perror("select()");
1174                APP_DPRINT ( " : Error \n");
1175                break;
1176            }
1177
1178            if(retval == 0) {
1179                APP_DPRINT ("%d :: BasicFn App Timeout !!!!!!!!!!! \n",__LINE__);
1180            }
1181
1182            switch (atoi(argv[3])) {
1183            case 1:
1184            case 5:
1185            case 6:
1186            case 8:
1187                    if(FD_ISSET(IpBuf_Pipe[0], &rfds)) {
1188                       OMX_BUFFERHEADERTYPE* pBuffer;
1189                       read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1190                       pBuffer->nTimeStamp = rand() % 100;
1191                       pBuffer->nTickCount = rand() % 70;
1192                       TIME_PRINT("TimeStamp Input: %lld\n",pBuffer->nTimeStamp);
1193                       TICK_PRINT("TickCount Input: %ld\n",pBuffer->nTickCount);
1194                       if(!playCompleted)
1195                        {
1196                            APP_DPRINT("APP:: %d send_input_buffer (pHandle, pBuffer, fIn)\n", __LINE__);
1197                            error = send_input_buffer (pHandle, pBuffer, fIn);
1198                        }
1199                       if (error != OMX_ErrorNone) {
1200                           printf ("Error While reading input pipe\n");
1201                           goto EXIT;
1202                       }
1203                       frmCnt++;
1204                    }
1205                    break;
1206
1207            case 7:
1208                    if(FD_ISSET(IpBuf_Pipe[0], &rfds)) {
1209                       OMX_BUFFERHEADERTYPE* pBuffer;
1210                       read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1211                       error = send_input_buffer_tc7 (pHandle, pBuffer, fIn);
1212                       if (error != OMX_ErrorNone) {
1213                           printf ("Error While reading input pipe\n");
1214                           goto EXIT;
1215                       }
1216                       frmCnt++;
1217                    }
1218                    break;
1219
1220            case 2:
1221                    if(frmCount == 10) {
1222                        printf (" Sending Stop command to Codec \n");
1223
1224#ifdef OMX_GETTIME
1225                        GT_START();
1226                        error = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StateIdle, NULL);
1227                        GT_END("Call to SendCommand <OMX_StateIdle> ");
1228#else
1229                        error = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StateIdle, NULL);
1230#endif
1231                        if(error != OMX_ErrorNone) {
1232                            fprintf (stderr,"Error from SendCommand-Pasue State function\n");
1233                            goto EXIT;
1234                        }
1235                    }
1236                    if(FD_ISSET(IpBuf_Pipe[0], &rfds)) {
1237                       OMX_BUFFERHEADERTYPE* pBuffer;
1238                       read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1239
1240                       error = send_input_buffer (pHandle, pBuffer, fIn);
1241                       if (error != OMX_ErrorNone) {
1242                           printf ("Error While reading input pipe\n");
1243                           goto EXIT;
1244                       }
1245                       frmCnt++;
1246                    }
1247                    break;
1248
1249            case 4:
1250                if(FD_ISSET(IpBuf_Pipe[0], &rfds)) {
1251
1252                    OMX_BUFFERHEADERTYPE* pBuffer;
1253                    read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1254
1255                    if(frmCount >= 5) {
1256                        fprintf(stderr, "Shutting down ---------- \n");
1257#ifdef OMX_GETTIME
1258                        GT_START();
1259                        error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL);
1260                        GT_END("Call to SendCommand <OMX_StateIdle>");
1261#else
1262                        error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL);;
1263#endif
1264
1265                        if(error != OMX_ErrorNone) {
1266                            fprintf (stderr,"Error from SendCommand-Idle(Stop) State function\n");
1267                            goto EXIT;
1268                        }
1269                        done = 1;
1270                    }
1271                    else {
1272                        error = send_input_buffer (pHandle, pBuffer, fIn);
1273                        if (error != OMX_ErrorNone) {
1274                            printf ("Error While reading input pipe\n");
1275                            goto EXIT;
1276                        }
1277                    }
1278                    frmCnt++;
1279                }
1280                 break;
1281
1282            case 3:
1283                    if (frmCount == 8) {
1284                        printf (" Sending Resume command to Codec \n");
1285#ifdef OMX_GETTIME
1286                        GT_START();
1287                        error = OMX_SendCommand(pHandle, OMX_CommandStateSet,OMX_StateExecuting, NULL);
1288                        GT_END("Call to SendCommand <OMX_StateExecuting>");
1289#else
1290                        error = OMX_SendCommand(pHandle, OMX_CommandStateSet,OMX_StateExecuting, NULL);
1291#endif
1292                        if(error != OMX_ErrorNone) {
1293                            fprintf (stderr,"Error from SendCommand-Executing State function\n");
1294                            goto EXIT;
1295                        }
1296                        /* Wait for startup to complete */
1297                        error = WaitForState(pHandle, OMX_StateExecuting);
1298
1299                        if(error != OMX_ErrorNone) {
1300                            fprintf(stderr, "Error:  hPcmDecoder->WaitForState reports an error %X\n", error);
1301                            goto EXIT;
1302                        }
1303                    }
1304                    if(frmCount == 6) {
1305                        printf (" Sending Pause command to Codec \n");
1306
1307#ifdef OMX_GETTIME
1308                        GT_START();
1309                        error = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StatePause, NULL);
1310                        GT_END("Call to SendCommand <OMX_StatePause> ");
1311#else
1312                        error = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StatePause, NULL);
1313#endif
1314                        if(error != OMX_ErrorNone) {
1315                            fprintf (stderr,"Error from SendCommand-Pasue State function\n");
1316                            goto EXIT;
1317                        }
1318                        /* Wait for startup to complete */
1319                        error = WaitForState(pHandle, OMX_StatePause);
1320                        if(error != OMX_ErrorNone) {
1321                        fprintf(stderr, "Error:  hPcmDecoder->WaitForState reports an error %X\n", error);
1322                        goto EXIT;
1323                        }
1324                    }
1325
1326                    if(FD_ISSET(IpBuf_Pipe[0], &rfds)) {
1327                       OMX_BUFFERHEADERTYPE* pBuffer;
1328                       read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1329
1330                       error = send_input_buffer (pHandle, pBuffer, fIn);
1331                       if (error != OMX_ErrorNone) {
1332                           printf ("Error While reading input pipe\n");
1333                           goto EXIT;
1334                       }
1335                       frmCnt++;
1336                    }
1337                    break;
1338			case 9:
1339					if(FD_ISSET(IpBuf_Pipe[0], &rfds)) {
1340						OMX_BUFFERHEADERTYPE* pBuffer;
1341						read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1342						if(!playCompleted && pBuffer->nFlags!=OMX_BUFFERFLAG_EOS){
1343							pBuffer->nFlags = 0;
1344                            error = send_input_buffer (pHandle, pBuffer, fIn);
1345                        }
1346
1347						if (error != OMX_ErrorNone) {
1348							goto EXIT;
1349						}
1350						frmCnt++;
1351					}
1352					break;
1353
1354            default:
1355                    APP_DPRINT("%d :: ### Running Simple DEFAULT Case Here ###\n",__LINE__);
1356            }
1357            if( FD_ISSET(OpBuf_Pipe[0], &rfds) ) {
1358                OMX_BUFFERHEADERTYPE* pBuf;
1359                read(OpBuf_Pipe[0], &pBuf, sizeof(pBuf));
1360                fwrite(pBuf->pBuffer, 1, pBuf->nFilledLen, fOut);
1361                fflush(fOut);
1362                APP_DPRINT("Writing %d bytes to file\n",pBuf->nFilledLen);
1363                if (curState == OMX_StateExecuting && !playCompleted)
1364                {
1365                    pComponent->FillThisBuffer(pHandle, pBuf);
1366                }
1367				if (atoi(argv[3]) == 7) {
1368					pComponent->FillThisBuffer(pHandle, pBuf);
1369				}
1370
1371    			if(pBuf->nFlags == OMX_BUFFERFLAG_EOS){
1372    				APP_DPRINT("State to Idle :: pBuf->nFlags == OMX_BUFFERFLAG_EOS\n");
1373					pBuf->nFlags = 0;
1374    			}
1375            }
1376
1377
1378            if(done == 1) {
1379                error = pComponent->GetState(pHandle, &state);
1380    			printf("done\n");
1381                if(error != OMX_ErrorNone) {
1382                    APP_DPRINT("%d:: Warning:  hWmaEncoder->GetState has returned status %X\n",
1383                                                                                      __LINE__, error);
1384                    goto EXIT;
1385                }
1386            }
1387            if (playCompleted){
1388				if((atoi(argv[3]) == 9) && (i != 9)){
1389					puts("*RING_TONE: Lets play again!");
1390					playCompleted = 0;
1391					goto my_exit;
1392				}else{
1393					printf ("APP :: Play Completed. Stop component \n");
1394	                StopComponent(pHandle);
1395	                playCompleted = 0;
1396				}
1397            }
1398            OMX_GetState(pHandle,&curState);
1399        } /* While Loop Ending Here */
1400
1401        printf ("The current state of the component = %d \n",curState);
1402		my_exit:
1403	        fclose(fOut);
1404	        fclose(fIn);
1405
1406    } /*Inner for loop ends here */
1407
1408    if(sampleRateChange) {
1409        /*cmd_data.hComponent = pHandle;
1410        cmd_data.AM_Cmd = AM_CommandWarnSampleFreqChange;
1411        cmd_data.param1 = 48000;*/
1412
1413#ifdef DSP_RENDERING_ON
1414        if((write(wmadecfdwrite, &cmd_data, sizeof(cmd_data)))<0) {
1415            printf("send command to audio manager\n");
1416        }
1417#endif
1418    }
1419/*
1420    cmd_data.hComponent = pHandle;
1421    cmd_data.AM_Cmd = AM_Exit;
1422    */
1423
1424#ifdef DSP_RENDERING_ON
1425    if((write(wmadecfdwrite, &cmd_data, sizeof(cmd_data)))<0)
1426        printf("%d ::OMX_WMADecoder.c :: [WMA Dec Component] - send command to audio manager\n",__LINE__);
1427    close(wmadecfdwrite);
1428    close(wmadecfdread);
1429#endif
1430
1431    printf ("Sending the StateLoaded Command\n");
1432
1433#ifdef OMX_GETTIME
1434    GT_START();
1435    error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateLoaded, NULL);
1436    GT_END("Call to SendCommand <OMX_StateLoaded>");
1437#else
1438    error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateLoaded, NULL);
1439#endif
1440    if(error != OMX_ErrorNone) {
1441        APP_DPRINT ("%d:: Error from SendCommand-Idle State function\n",__LINE__);
1442        goto EXIT;
1443    }
1444
1445    /* free buffers */
1446    for (i=0; i < numInputBuffers; i++) {
1447        error = OMX_FreeBuffer(pHandle,OMX_DirInput,pInputBufferHeader[i]);
1448        if( (error != OMX_ErrorNone)) {
1449            APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
1450            goto EXIT;
1451        }
1452    }
1453
1454    for (i=0; i < numOutputBuffers; i++) {
1455        error = OMX_FreeBuffer(pHandle,OMX_DirOutput,pOutputBufferHeader[i]);
1456        if( (error != OMX_ErrorNone)) {
1457            APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
1458            goto EXIT;
1459        }
1460    }
1461
1462#ifdef OMX_GETTIME
1463    GT_START();
1464    error = OMX_SendCommand(pHandle, OMX_CommandPortDisable, -1, NULL);
1465    GT_END("Call to SendCommand <OMX_CommandPortDisable>");
1466#else
1467    error = OMX_SendCommand(pHandle, OMX_CommandPortDisable, -1, NULL);
1468#endif
1469	/* Wait for startup to complete */
1470    error = WaitForState(pHandle, OMX_StateLoaded);
1471    if(error != OMX_ErrorNone) {
1472        APP_DPRINT( "Error:  hWmaEncoder->WaitForState reports an error %X\n", error);
1473        goto EXIT;
1474    }
1475
1476#ifdef USE_BUFFER
1477    APP_MEMPRINT("%d:::[TESTAPPFREE] %p\n",__LINE__,pInputBuffer);
1478    newfree(pInputBuffer);
1479    pOutputBuffer -= 128;
1480    APP_MEMPRINT("%d:::[TESTAPPFREE] %p\n",__LINE__,pOutputBuffer);
1481    newfree(pOutputBuffer);
1482#endif
1483    printf ("Free the Component handle\n");
1484    /* Unload the WMA Encoder Component */
1485    error = TIOMX_FreeHandle(pHandle);
1486    APP_MEMPRINT("%d:::[TESTAPPFREE] %p\n",__LINE__,pWmaParam);
1487    newfree(pWmaParam);
1488    APP_MEMPRINT("%d:::[TESTAPPFREE] %p\n",__LINE__,pCompPrivateStruct->format.audio.cMIMEType);
1489    newfree(pCompPrivateStruct->format.audio.cMIMEType);
1490    APP_MEMPRINT("%d:::[TESTAPPFREE] %p\n",__LINE__,pCompPrivateStruct);
1491    newfree(pCompPrivateStruct);
1492    if( (error != OMX_ErrorNone)) {
1493        APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
1494        goto EXIT;
1495    }
1496    close(IpBuf_Pipe[0]);
1497    close(IpBuf_Pipe[1]);
1498    close(OpBuf_Pipe[0]);
1499    close(OpBuf_Pipe[1]);
1500    APP_DPRINT ("%d:: Free Handle returned Successfully \n\n\n\n",__LINE__);
1501
1502    } /*Outer for loop ends here */
1503
1504    pthread_mutex_destroy(&WaitForState_mutex);
1505    pthread_cond_destroy(&WaitForState_threshold);
1506	error = TIOMX_Deinit();
1507    if( (error != OMX_ErrorNone)) {
1508			APP_DPRINT("APP: Error in Deinit Core function\n");
1509			goto EXIT;
1510    }
1511#ifdef APP_MEMDEBUG
1512    printf("\n-Printing memory not deleted-\n");
1513
1514    for(r=0;r<500;r++){
1515
1516        if (lines[r]!=0){
1517
1518            printf(" --->%d Bytes allocated on %p File:%s Line: %d\n",bytes[r],arr[r],file[r],lines[r]);
1519
1520        }
1521
1522    }
1523#endif
1524
1525EXIT:
1526	if(bInvalidState==OMX_TRUE)
1527	{
1528
1529#ifndef USE_BUFFER
1530		error = FreeAllResources(pHandle,
1531								pInputBufferHeader[0],
1532								pOutputBufferHeader[0],
1533								numInputBuffers,
1534								numOutputBuffers,
1535								fIn,fOut);
1536#else
1537		error = freeAllUseResources(pHandle,
1538									pInputBuffer,
1539									pOutputBuffer,
1540									numInputBuffers,,
1541									numOutputBuffers,
1542									fIn,fOut);
1543#endif
1544	}else{
1545	}
1546#ifdef OMX_GETTIME
1547  GT_END("WMA_DEC test <End>");
1548  OMX_ListDestroy(pListHead);
1549#endif
1550  return error;
1551}
1552
1553/* ================================================================================= */
1554/**
1555* @fn send_input_buffer() description for send_input_buffer
1556send_input_buffer().
1557Sends input buffer to component
1558*
1559*/
1560/* ================================================================================ */
1561OMX_ERRORTYPE send_input_buffer(OMX_HANDLETYPE pHandle, OMX_BUFFERHEADERTYPE* pBuffer, FILE *fIn)
1562{
1563
1564    OMX_ERRORTYPE error = OMX_ErrorNone;
1565    OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)pHandle;
1566    int nRead = fill_data (pBuffer, fIn);
1567
1568
1569    if(nRead <= 0) {
1570        APP_DPRINT("Sending EOS\n");
1571        pBuffer->nFlags = OMX_BUFFERFLAG_EOS;
1572        pBuffer->nFilledLen = nRead;
1573        APP_DPRINT("nRead = %d\n",nRead);
1574        APP_DPRINT("Last EmptyThisBuffer\n");
1575        pComponent->EmptyThisBuffer(pHandle, pBuffer);
1576        lastBufferSent = 1;
1577    }
1578    else {
1579        APP_DPRINT("Send input buffer nRead = %d\n",nRead);
1580        pBuffer->nFilledLen = nRead;
1581        if(!(pBuffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)){
1582          pBuffer->nFlags = 0;
1583        }
1584        pComponent->EmptyThisBuffer(pHandle, pBuffer);
1585    }
1586    return error;
1587}
1588/* ================================================================================= */
1589/**
1590* @fn send_input_buffer() description for send_input_buffer
1591send_input_buffer().
1592Sends input buffer to component
1593*
1594*/
1595/* ================================================================================ */
1596OMX_ERRORTYPE send_input_buffer_tc7(OMX_HANDLETYPE pHandle, OMX_BUFFERHEADERTYPE* pBuffer, FILE *fIn)
1597{
1598    OMX_ERRORTYPE error = OMX_ErrorNone;
1599    OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)pHandle;
1600    int nRead = fill_data_tc7 (pBuffer, fIn);
1601    if(nRead < pBuffer->nAllocLen) {
1602       pBuffer->nFlags = OMX_BUFFERFLAG_EOS;
1603#ifdef OMX_GETTIME
1604    GT_START();
1605       error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL);
1606    GT_END("Call to SendCommand <OMX_StateIdle> ");
1607#else
1608       error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL);
1609#endif
1610
1611    }
1612    else {
1613        pBuffer->nFilledLen = nRead;
1614        pComponent->EmptyThisBuffer(pHandle, pBuffer);
1615    }
1616    return error;
1617}
1618
1619/* ================================================================================= */
1620/**
1621* @fn fill_data() description for fill_data
1622fill_data().
1623Fills input buffer
1624*
1625*/
1626/* ================================================================================ */
1627int fill_data (OMX_BUFFERHEADERTYPE *pBuf,FILE *fIn)
1628{
1629    int nRead;
1630    OMX_U32 packetSize;
1631    OMX_U8 byteOffset;
1632    static OMX_U8 first_cap = 0;
1633    static OMX_U8 first_buff = 0;
1634    static int totalRead = 0;
1635    static int fileHdrReadFlag = 0;
1636    static int ccnt = 1;
1637    static int payload=0;
1638    OMX_U8 temp = 0;
1639    nRead = 0;
1640    byteOffset = 0;
1641    if(frameMode)
1642    {
1643      /* TODO: Update framemode TC to match component */
1644        if (!fileHdrReadFlag) {
1645            /*The first input buffer readed have the .rca header information*/
1646            nRead = fread(pBuf->pBuffer, 1, 70, fIn);
1647            byteOffset = 70;
1648            fileHdrReadFlag = 1;
1649        }
1650        /*Read packet header, buffer begins at the offset*/
1651        nRead += fread(pBuf->pBuffer + byteOffset, 1, 5, fIn);
1652        /*Extract Packet size*/
1653        packetSize = *((OMX_U32 *)(pBuf->pBuffer + byteOffset + 1));
1654        /*Read the rest of the packet, buffer begins at the end of the packet header*/
1655        byteOffset += 5;
1656        nRead += fread(pBuf->pBuffer + byteOffset, 1, packetSize, fIn);
1657    }
1658    else
1659    {
1660      if(first_buff){
1661        if (first_cap){
1662          fread(&temp,5,1,fIn); // moving file 5 bytes
1663        }
1664        first_cap =1;
1665        nRead = fread(pBuf->pBuffer, 1, payload, fIn);
1666        if(pBuf->nFlags & OMX_BUFFERFLAG_CODECCONFIG)
1667        {
1668          pBuf->nFlags = 0;
1669        }
1670      }
1671      else{
1672        nRead = unParse_Header(pBuf->pBuffer,fIn, &payload);
1673        pBuf->nFlags = OMX_BUFFERFLAG_CODECCONFIG;
1674        first_buff=1;
1675      }
1676    }
1677    totalRead += nRead;
1678    pBuf->nFilledLen = nRead;
1679    APP_DPRINT("\n*****************************************************\n");
1680    APP_DPRINT("%d :: App:: Read IpBuff = %p pBuf->nAllocLen = * %ld, nRead = %ld\n",
1681                   __LINE__, pBuf->pBuffer, pBuf->nAllocLen, nRead);
1682    APP_DPRINT("\n*****************************************************\n");
1683    ccnt++;
1684    return nRead;
1685}
1686
1687/* ================================================================================= */
1688/**
1689* @fn fill_data() description for fill_data
1690fill_data().
1691Fills input buffer
1692*
1693*/
1694/* ================================================================================ */
1695int fill_data_tc7 (OMX_BUFFERHEADERTYPE *pBuf,FILE *fIn)
1696{
1697    int nRead;
1698    static int totalRead = 0;
1699    static int fileHdrReadFlag = 0;
1700    static int ccnt = 1;
1701    OMX_U8* tempBuffer;
1702    OMX_U8* pBufferOffset;
1703
1704    if (!fileHdrReadFlag) {
1705        nRead = fread(pBuf->pBuffer, 1,75 , fIn);
1706        tempBuffer = newmalloc(19500*sizeof(OMX_U8));
1707        fread(tempBuffer, 1, 19500, fIn);
1708        newfree(tempBuffer);
1709        pBufferOffset = pBuf->pBuffer;
1710        pBufferOffset += 75;
1711        nRead += fread(pBufferOffset, 1, pBuf->nAllocLen-75, fIn);
1712        fileHdrReadFlag = 1;
1713    }
1714    else {
1715        nRead = fread(pBuf->pBuffer, 1, pBuf->nAllocLen , fIn);
1716    }
1717
1718    APP_DPRINT("\n*****************************************************\n");
1719    APP_DPRINT ("%d :: App:: pBuf->pBuffer = %p pBuf->nAllocLen = * %ld, nRead = %ld\n",__LINE__, pBuf->pBuffer, pBuf->nAllocLen, nRead);
1720    APP_DPRINT("\n*****************************************************\n");
1721
1722    totalRead += nRead;
1723    pBuf->nFilledLen = nRead;
1724    ccnt++;
1725    return nRead;
1726}
1727
1728float calc_buff_size(FILE *fIn)
1729{
1730    int nRead;
1731    OMX_U64 playDuration;
1732    OMX_U64 numPackets;
1733    OMX_U16 sampleRate;
1734    OMX_U16 channelNum;
1735    long double pcmBytesPerPacket;
1736    float outBuffSize;
1737    OMX_U8* pBuffer;
1738    pBuffer = newmalloc((OMX_U8) 100);
1739
1740    /*Read first 70 bytes header + 5 bytes first packet header*/
1741    nRead = fread(pBuffer, 1, 70, fIn);
1742    /*for(i = 0; i < 70; i++)
1743    {
1744        printf("pBuffer[%d] = 0x%x\n", i, pBuffer[i]);
1745    }*/
1746    numPackets = *((OMX_U64 *)pBuffer);
1747    playDuration = *((OMX_U64 *)(pBuffer + 8));
1748    /*playDuration = 906880000;*/
1749    sampleRate = *((OMX_U16 *)(pBuffer + 46));
1750    channelNum = *((OMX_U16 *)(pBuffer + 44));
1751    APP_DPRINT("numPackets %lld\n", numPackets);
1752    APP_DPRINT("playDuration %lld\n", playDuration);
1753    APP_DPRINT("sampleRate %d\n", sampleRate);
1754    APP_DPRINT("channelNum %d\n", channelNum);
1755    pcmBytesPerPacket = (long double)playDuration * (long double) sampleRate / (10000000 * (long double) numPackets);
1756    APP_DPRINT("pcmBytesPerPacket %f\n", pcmBytesPerPacket);
1757    outBuffSize = OUTPUT_WMADEC_BUFFER_SIZE + pcmBytesPerPacket * channelNum * 2;
1758    APP_DPRINT("outBuffSize %f\n", outBuffSize);
1759    newfree(pBuffer);
1760    return outBuffSize;
1761}
1762
1763void fill_init_params(OMX_HANDLETYPE pHandle,const char * filename,int dasfmode, TI_OMX_DATAPATH * dataPath)
1764{
1765    OMX_ERRORTYPE error = OMX_ErrorNone;
1766    WMA_HeadInfo* pHeaderInfo;
1767	OMX_INDEXTYPE index;
1768	OMX_ERRORTYPE eError1 = OMX_ErrorNone;
1769	TI_OMX_DSP_DEFINITION dspDefinition;
1770    OMX_U32 samplerate;
1771    OMX_U8 i;
1772    OMX_U8 temp;
1773    OMX_U16 arr[50];
1774    FILE *parameterFile;
1775    pHeaderInfo = newmalloc(sizeof(WMA_HeadInfo));
1776    if (pHeaderInfo == NULL)
1777    {
1778        printf("Could not allocate pHeaderInfo\n");
1779		goto EXIT;
1780    }
1781
1782    parameterFile = fopen(filename,"r");
1783    if (parameterFile == NULL)
1784    {
1785        printf("Could not open file\n");
1786        goto EXIT;
1787    }
1788    memset(arr,(int) NULL, 50);
1789    /*Read first 50 bytes of input file*/
1790    for (i = 0 ; i< 50 ; i++)
1791    {
1792        fscanf(parameterFile, "%c", &temp);
1793        arr[i] = temp;
1794    }
1795    fclose(parameterFile);
1796    /*Obtain sample rate from 46th and 48th bytes*/
1797    samplerate = arr[47] << 8 | arr[46];
1798
1799	dspDefinition.wmaHeaderInfo = pHeaderInfo;
1800    pHeaderInfo->iSamplePerSec = samplerate;
1801    pHeaderInfo->iChannel = arr[44];
1802
1803	dspDefinition.dasfMode = dasfmode;
1804
1805	eError1 = OMX_GetExtensionIndex(pHandle, "OMX.TI.index.config.wmaheaderinfo",&index);
1806	if (eError1 != OMX_ErrorNone) {
1807		printf("Error getting extension index\n");
1808		goto EXIT;
1809	}
1810
1811    /*OMX_SetConfig(pHandle,index,&dspDefinition);*/
1812    /*cmd_data.hComponent = pHandle;
1813    cmd_data.AM_Cmd = AM_CommandIsOutputStreamAvailable;
1814    */
1815    /* for decoder, using AM_CommandIsInputStreamAvailable */
1816    /*cmd_data.param1 = 0;*/
1817#ifdef DSP_RENDERING_ON
1818    if((write(wmadecfdwrite, &cmd_data, sizeof(cmd_data)))<0) {
1819        printf("%d [WMA Dec Component] - send command to audio manager\n", __LINE__);
1820        goto EXIT;
1821    }
1822    if((read(wmadecfdread, &cmd_data, sizeof(cmd_data)))<0) {
1823        printf("%d [WMA Dec Component] - failure to get data from the audio manager\n", __LINE__);
1824		goto EXIT;
1825    }
1826#endif
1827    /*dspDefinition.streamId = cmd_data.streamID; */
1828    if(dspDefinition.dasfMode)
1829        printf("***************StreamId=%d******************\n", (int)dspDefinition.streamId);
1830
1831    error = OMX_SetConfig(pHandle,index,&dspDefinition);
1832	if (error != OMX_ErrorNone) {
1833		printf("Error in SetConfig\n");
1834		goto EXIT;
1835	}
1836
1837    error = OMX_GetExtensionIndex(pHandle, "OMX.TI.index.config.wmadec.datapath",&index);
1838	if (error != OMX_ErrorNone) {
1839		printf("Error getting extension index\n");
1840		goto EXIT;
1841	}
1842
1843	error = OMX_SetConfig (pHandle, index, dataPath);
1844    if(error != OMX_ErrorNone) {
1845        error = OMX_ErrorBadParameter;
1846        APP_DPRINT("%d :: WmaDecTest.c :: Error from OMX_SetConfig() function\n",__LINE__);
1847        goto EXIT;
1848    }
1849
1850EXIT:
1851    if(pHeaderInfo != NULL)
1852    {
1853        newfree(pHeaderInfo);
1854    }
1855
1856    printf("Exiting fill_init_params()\n");
1857}
1858
1859OMX_ERRORTYPE StopComponent(OMX_HANDLETYPE *pHandle)
1860{
1861    OMX_ERRORTYPE error = OMX_ErrorNone;
1862
1863#ifdef OMX_GETTIME
1864    GT_START();
1865    error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL);
1866    GT_END("Call to SendCommand <OMX_StateIdle>");
1867#else
1868    error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL);
1869#endif
1870	if(error != OMX_ErrorNone) {
1871                    fprintf (stderr,"\nError from SendCommand-Idle(Stop) State function!!!!!!!!\n");
1872                    goto EXIT;
1873		}
1874    error =	WaitForState(pHandle, OMX_StateIdle);
1875    if(error != OMX_ErrorNone) {
1876    	fprintf(stderr, "\nError:  WaitForState reports an error %X!!!!!!!\n", error);
1877    	goto EXIT;
1878	}
1879EXIT:
1880    return error;
1881}
1882
1883
1884#ifdef APP_MEMDEBUG
1885void * mymalloc(int line, char *s, int size)
1886{
1887   void *p;
1888   int e=0;
1889   p = malloc(size);
1890   if(p==NULL){
1891       printf("Memory not available\n");
1892       exit(1);
1893       }
1894   else{
1895         while((lines[e]!=0)&& (e<500) ){
1896              e++;
1897         }
1898         arr[e]=p;
1899         lines[e]=line;
1900         bytes[e]=size;
1901         strcpy(file[e],s);
1902         printf("Allocating %d bytes on address %p, line %d file %s pos %d\n", size, p, line, s, e);
1903         return p;
1904   }
1905}
1906
1907int myfree(void *dp, int line, char *s)
1908{
1909    int q;
1910    for(q=0;q<500;q++){
1911        if(arr[q]==dp){
1912           printf("Deleting %d bytes on address %p, line %d file %s\n", bytes[q],dp, line, s);
1913           free(dp);
1914           dp = NULL;
1915           lines[q]=0;
1916           strcpy(file[q],"");
1917           break;
1918        }
1919     }
1920     if(500==q)
1921         printf("\n\nPointer not found. Line:%d    File%s!!\n\n",line, s);
1922
1923     return 0;
1924}
1925#endif
1926
1927
1928/*=================================================================
1929
1930							Freeing All allocated resources
1931
1932==================================================================*/
1933
1934int FreeAllResources( OMX_HANDLETYPE pHandle,
1935			                OMX_BUFFERHEADERTYPE* pBufferIn,
1936			                OMX_BUFFERHEADERTYPE* pBufferOut,
1937			                int NIB, int NOB,
1938			                FILE* fIn, FILE* fOut)
1939{
1940/*	show_meminfo(&mem1); */
1941	printf("%d::Freeing all resources by state invalid \n",__LINE__);
1942	OMX_ERRORTYPE eError1 = OMX_ErrorNone;
1943	OMX_U16 i;
1944	for(i=0; i < NIB; i++) {
1945		   printf("%d :: APP: About to free pInputBufferHeader[%d]\n",__LINE__, i);
1946		   eError1 = OMX_FreeBuffer(pHandle, OMX_DirInput, pBufferIn+i);
1947
1948	}
1949
1950
1951	for(i=0; i < NOB; i++) {
1952		   printf("%d :: APP: About to free pOutputBufferHeader[%d]\n",__LINE__, i);
1953		   eError1 = OMX_FreeBuffer(pHandle, OMX_DirOutput, pBufferOut+i);
1954	}
1955
1956	/*i value is fixed by the number calls to malloc in the App */
1957	for(i=0; i<6;i++)
1958	{
1959		if (ArrayOfPointers[i] != NULL){
1960			 printf("%d :: APP: About to free ArrayOfPointers[%d]\n",__LINE__, i);
1961			newfree(ArrayOfPointers[i]);
1962		}
1963	}
1964
1965
1966	    eError1 = close (IpBuf_Pipe[0]);
1967	    eError1 = close (IpBuf_Pipe[1]);
1968	    eError1 = close (OpBuf_Pipe[0]);
1969	    eError1 = close (OpBuf_Pipe[1]);
1970	if(fOut != NULL)	/* Could have been closed  previously */
1971	{
1972		fclose(fOut);
1973		fOut=NULL;
1974	}
1975
1976	if(fIn != NULL)
1977	{	fclose(fIn);
1978		fIn=NULL;
1979	}
1980/*	show_meminfo(&mem2); */
1981
1982	TIOMX_FreeHandle(pHandle);
1983
1984/*	show_meminfo(&mem2); */
1985/*	show_memcomp(&mem1,&mem2);*/
1986
1987	return eError1;
1988}
1989
1990/*=================================================================
1991							Freeing the resources with USE_BUFFER define
1992==================================================================*/
1993#ifdef USE_BUFFER
1994
1995int freeAllUseResources(OMX_HANDLETYPE pHandle,
1996							OMX_U8* UseInpBuf[],
1997							OMX_U8* UseOutBuf[],
1998							int NIB,int NOB,
1999							FILE* fIn, FILE* fOut)
2000{
2001		OMX_ERRORTYPE eError1 = OMX_ErrorNone;
2002		OMX_U16 i;
2003		printf("%d::Freeing all resources by state invalid \n",__LINE__);
2004    	/* free the UseBuffers */
2005	    for(i=0; i < NIB; i++) {
2006		   UseInpBuf[i] = UseInpBuf[i] - 128;
2007		   printf("%d :: [TESTAPPFREE] pInputBuffer[%d] = %p\n",__LINE__,i,(UseInpBuf[i]));
2008		   if(UseInpBuf[i] != NULL){
2009			  newfree(UseInpBuf[i]);
2010			  UseInpBuf[i] = NULL;
2011		   }
2012		}
2013
2014	    for(i=0; i < NOB; i++) {
2015		   UseOutBuf[i] = UseOutBuf[i] - 128;
2016		   printf("%d :: [TESTAPPFREE] pOutputBuffer[%d] = %p\n",__LINE__,i, UseOutBuf[i]);
2017		   if(UseOutBuf[i] != NULL){
2018			  newfree(UseOutBuf[i]);
2019			  UseOutBuf[i] = NULL;
2020		   }
2021		}
2022
2023	/*i value is fixed by the number calls to malloc in the App */
2024		for(i=0; i<6;i++)
2025		{
2026			if (ArrayOfPointers[i] != NULL)
2027				newfree(ArrayOfPointers[i]);
2028		}
2029			eError1 = close (IpBuf_Pipe[0]);
2030			eError1 = close (IpBuf_Pipe[1]);
2031			eError1 = close (OpBuf_Pipe[0]);
2032			eError1 = close (OpBuf_Pipe[1]);
2033
2034		if (fOut != NULL)	/* Could have been closed  previously */ */
2035		{
2036			fclose(fOut);
2037			fOut=NULL;
2038		}
2039		if (fIn != NULL)
2040		{	fclose(fIn);
2041			fIn=NULL;
2042		}
2043		OMX_FreeHandle(pHandle);
2044
2045		return eError1;
2046}
2047
2048#endif
2049/* ================================================================================= */
2050/**
2051* @fn unParse_Header
2052* To match Android OMX Component, wee need to extract the info from the rca pattern
2053* to build the config buffer.
2054*/
2055/* ================================================================================ */
2056int unParse_Header (OMX_U8* pBuffer, FILE *fIn, int * payload){
2057
2058  OMX_U8* tempBuffer= malloc(75);
2059  memset(pBuffer,0x00,75);
2060  memset(tempBuffer,0x00,75);
2061  fread(tempBuffer,75,1,fIn);
2062  tempBuffer+=42;
2063  memcpy(pBuffer,tempBuffer,sizeof(OMX_U16));
2064  tempBuffer+=2;
2065  memcpy(pBuffer+2,tempBuffer,sizeof(OMX_U16));
2066  tempBuffer+=2;
2067  memcpy(pBuffer+4,tempBuffer,sizeof(OMX_U32));
2068  tempBuffer+=4;
2069  memcpy(pBuffer+8,tempBuffer,sizeof(OMX_U32));
2070  tempBuffer+=4;
2071  memcpy(pBuffer+12,tempBuffer,sizeof(OMX_U16));
2072  tempBuffer+=2;
2073  memcpy(pBuffer+14,tempBuffer,sizeof(OMX_U16));
2074  tempBuffer+=8;
2075  memcpy(pBuffer+22,tempBuffer,sizeof(OMX_U16));
2076  tempBuffer += 7;
2077  *payload = *((OMX_U16*)tempBuffer);
2078  return 28;
2079}
2080