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