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 152 FILE *fpRes; 153 static OMX_BOOL bInvalidState; 154 void* ArrayOfPointers[6]; 155 156 pthread_mutex_t WaitForState_mutex; 157 pthread_cond_t WaitForState_threshold; 158 OMX_U8 WaitForState_flag; 159 OMX_U8 TargetedState; 160 161 int wmadecfdwrite; 162 int wmadecfdread; 163 164 /*AM_COMMANDDATATYPE cmd_data;*/ 165 166 int gMimeFlag = 0; 167 int gStateNotifi = 0; 168 int gState; 169 int lastBufferSent = 0; 170 static int playCompleted = 0; 171 int sampleRateChange = 0; 172 173 fd_set rfds; 174 int done = 0; 175 int whileloopdone = 0; 176 int frameMode = 0; 177 /******************************************************************************/ 178 OMX_S16 numInputBuffers = 0; 179 OMX_S16 numOutputBuffers = 0; 180 #ifdef USE_BUFFER 181 OMX_U8* pInputBuffer[10]; 182 OMX_U8* pOutputBuffer[10]; 183 #endif 184 185 OMX_BUFFERHEADERTYPE* pInputBufferHeader[10]; 186 OMX_BUFFERHEADERTYPE* pOutputBufferHeader[10]; 187 188 /*FILE *fIn=NULL; 189 int timeToExit = 0;*/ 190 /* RM control */ 191 int preempted = 0; 192 int Event_Pipe[2]; 193 /******************************************************************************/ 194 195 /* ======================================================================= */ 196 /** 197 * Enumered Types 198 */ 199 /* ======================================================================= */ 200 typedef enum COMPONENTS { 201 COMP_1, 202 COMP_2 203 }COMPONENTS; 204 205 enum 206 { 207 NEXT_BITRATE_UNCHANGED = 0, 208 NEXT_BITRATE_CHANGED 209 }; 210 211 typedef enum 212 { 213 MIME_NO_SUPPORT = 0, 214 MIME_SUPPORTED 215 }MIME_Settings; 216 217 218 /* ======================================================================= */ 219 /** 220 * Function Declaration 221 */ 222 /* ======================================================================= */ 223 224 int GetInfoFromBufferHeader(unsigned char **pBufPtr, int *pCurBitRate, 225 int *pNextBitRateFlag); 226 227 void ResetBufferPointers(unsigned char **pBuffer); 228 int maxint(int a, int b); 229 230 int fill_data (OMX_BUFFERHEADERTYPE *pBuf, FILE *fIn); 231 int fill_data_tc7 (OMX_BUFFERHEADERTYPE *pBuf, FILE *fIn); 232 int unParse_Header (OMX_U8* pBuffer, FILE *fIn, int * payload); 233 void ConfigureAudio(); 234 235 OMX_STRING strWmaEncoder = "OMX.TI.WMA.decode"; 236 int IpBuf_Pipe[2]; 237 int OpBuf_Pipe[2]; 238 OMX_ERRORTYPE StopComponent(OMX_HANDLETYPE *pHandle); 239 OMX_ERRORTYPE send_input_buffer (OMX_HANDLETYPE pHandle, OMX_BUFFERHEADERTYPE* pBuffer, FILE *fIn); 240 OMX_ERRORTYPE send_input_buffer_tc7 (OMX_HANDLETYPE pHandle, OMX_BUFFERHEADERTYPE* pBuffer, FILE *fIn); 241 void fill_init_params(OMX_HANDLETYPE pHandle,const char * filename, int dasfmode, TI_OMX_DATAPATH * dataPath); 242 float calc_buff_size(FILE *fIn); 243 int 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 250 int 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 */ 259 int 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. */ 266 static 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 298 EventHandler(). 299 App event handler 300 * 301 * @see OMX_Core.h 302 */ 303 /* ================================================================================ */ 304 OMX_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 401 FillBufferDone(). 402 Called by the component when an output buffer has been filled 403 * 404 * @see OMX_Core.h 405 */ 406 /* ================================================================================ */ 407 void 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 427 EmptyBufferDone(). 428 Called by the component when an input buffer has been emptied 429 * 430 * @see OMX_Core.h 431 */ 432 /* ================================================================================ */ 433 void 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 452 main(). 453 Test app main function 454 * 455 * @see OMX_Core.h 456 */ 457 /* ================================================================================ */ 458 int main(int argc, char* argv[]) 459 { 460 461 printf("\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 1525 EXIT: 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 1556 send_input_buffer(). 1557 Sends input buffer to component 1558 * 1559 */ 1560 /* ================================================================================ */ 1561 OMX_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 1591 send_input_buffer(). 1592 Sends input buffer to component 1593 * 1594 */ 1595 /* ================================================================================ */ 1596 OMX_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 1622 fill_data(). 1623 Fills input buffer 1624 * 1625 */ 1626 /* ================================================================================ */ 1627 int 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 1690 fill_data(). 1691 Fills input buffer 1692 * 1693 */ 1694 /* ================================================================================ */ 1695 int 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 1728 float 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 1763 void 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 1850 EXIT: 1851 if(pHeaderInfo != NULL) 1852 { 1853 newfree(pHeaderInfo); 1854 } 1855 1856 printf("Exiting fill_init_params()\n"); 1857 } 1858 1859 OMX_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 } 1879 EXIT: 1880 return error; 1881 } 1882 1883 1884 #ifdef APP_MEMDEBUG 1885 void * 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 1907 int 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 1934 int 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 1995 int 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 /* ================================================================================ */ 2056 int 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