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