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 G711Enc_Test.c 26 * 27 * This file implements G711 Encoder Component Test Application to verify 28 * which is fully compliant with the Khronos OpenMAX (TM) 1.0 Specification 29 * 30 * @path $(CSLPATH)\OMAPSW_MPU\linux\audio\src\openmax_il\g711_enc\tests 31 * 32 * @rev 1.0 33 */ 34 /* ---------------------------------------------------------------------------- 35 *! 36 *! Revision History 37 *! =================================== 38 *! 12-Dec-2006: Initial Version 39 *! This is newest file 40 * =========================================================================== */ 41 /* ------compilation control switches -------------------------*/ 42 /**************************************************************** 43 * INCLUDE FILES 44 ****************************************************************/ 45 /* ----- system and platform files ----------------------------*/ 46 47 #include <unistd.h> 48 #include <sys/ioctl.h> 49 #include <sys/select.h> 50 #include <errno.h> 51 #include <linux/vt.h> 52 #include <signal.h> 53 #include <sys/stat.h> 54 #include <pthread.h> 55 #include <linux/soundcard.h> 56 57 #include <string.h> 58 #include <fcntl.h> 59 #include <stdlib.h> 60 #include <stdio.h> 61 62 #include <OMX_Index.h> 63 #include <OMX_Types.h> 64 #include <OMX_Core.h> 65 #include <OMX_Audio.h> 66 #include <TIDspOmx.h> 67 #include <OMX_Component.h> 68 69 70 #ifdef OMX_GETTIME 71 #include <OMX_Common_Utils.h> 72 #include <OMX_GetTime.h> /*Headers for Performance & measuremet */ 73 #endif 74 75 /* ======================================================================= */ 76 /** 77 * @def G711ENC_INPUT_BUFFER_SIZE Default input buffer size 78 */ 79 /* ======================================================================= */ 80 #define G711ENC_INPUT_BUFFER_SIZE 160 81 /* ======================================================================= */ 82 /** 83 * @def G711ENC_OUTPUT_BUFFER_SIZE Default output buffer size 84 */ 85 /* ======================================================================= */ 86 #define G711ENC_OUTPUT_BUFFER_SIZE 80 /*Component default output buffer size*/ 87 88 /* ======================================================================= */ 89 /* 90 * @def G711ENC_APP_ID App ID Value setting 91 */ 92 /* ======================================================================= */ 93 #define G711ENC_APP_ID 100 94 95 /* ======================================================================= */ 96 /* 97 * @def FIFO Communication with audiomanager 98 */ 99 /* ======================================================================= */ 100 #define FIFO1 "/dev/fifo.1" 101 #define FIFO2 "/dev/fifo.2" 102 103 #undef APP_DEBUG 104 105 #undef APP_MEMCHECK 106 107 #undef USE_BUFFER 108 109 /*For timestamp and tickcount*/ 110 #undef APP_TIME_TIC_DEBUG 111 112 #ifdef APP_DEBUG 113 #define APP_DPRINT(...) fprintf(stderr,__VA_ARGS__) 114 #else 115 #define APP_DPRINT(...) 116 #endif 117 118 #ifdef APP_MEMCHECK 119 #define APP_MEMPRINT(...) fprintf(stderr,__VA_ARGS__) 120 #else 121 #define APP_MEMPRINT(...) 122 #endif 123 124 #ifdef APP_TIME_TIC_DEBUG 125 #define TIME_PRINT(...) fprintf(stderr,__VA_ARGS__) 126 #define TICK_PRINT(...) fprintf(stderr,__VA_ARGS__) 127 #else 128 #define TIME_PRINT(...) 129 #define TICK_PRINT(...) 130 #endif 131 132 #ifdef OMX_GETTIME 133 OMX_ERRORTYPE eError = OMX_ErrorNone; 134 int GT_FlagE = 0; /* Fill Buffer 1 = First Buffer, 0 = Not First Buffer */ 135 int GT_FlagF = 0; /*Empty Buffer 1 = First Buffer, 0 = Not First Buffer */ 136 static OMX_NODE* pListHead = NULL; 137 #endif 138 139 pthread_mutex_t WaitForState_mutex; 140 pthread_cond_t WaitForState_threshold; 141 OMX_U8 WaitForState_flag = 0; 142 OMX_U8 TargetedState = 0; 143 144 typedef struct AUDIO_INFO { 145 OMX_U32 acdnMode; 146 OMX_U32 dasfMode; 147 OMX_U32 nIpBufs; 148 OMX_U32 nIpBufSize; 149 OMX_U32 nOpBufs; 150 OMX_U32 nOpBufSize; 151 OMX_U32 nMFrameMode; 152 } AUDIO_INFO; 153 154 /* ======================================================================= */ 155 /** 156 * M A C R O S FOR MALLOC and MEMORY FREE and CLOSING PIPES 157 */ 158 /* ======================================================================= */ 159 160 #define OMX_G711ENC_CONF_INIT_STRUCT(_s_, _name_) \ 161 memset((_s_), 0x0, sizeof(_name_)); \ 162 (_s_)->nSize = sizeof(_name_); \ 163 (_s_)->nVersion.s.nVersionMajor = 0x1; \ 164 (_s_)->nVersion.s.nVersionMinor = 0x0; \ 165 (_s_)->nVersion.s.nRevision = 0x0; \ 166 (_s_)->nVersion.s.nStep = 0x0 167 168 #define OMX_G711ENC_INIT_STRUCT(_s_, _name_) \ 169 memset((_s_), 0x0, sizeof(_name_)); \ 170 171 #define OMX_G711ENC_MALLOC_STRUCT(_pStruct_, _sName_) \ 172 _pStruct_ = (_sName_*)malloc(sizeof(_sName_)); \ 173 if(_pStruct_ == NULL){ \ 174 printf("***********************************\n"); \ 175 printf("%d Malloc Failed\n",__LINE__); \ 176 printf("***********************************\n"); \ 177 eError = OMX_ErrorInsufficientResources; \ 178 goto EXIT; \ 179 } \ 180 APP_MEMPRINT("%d ALLOCATING MEMORY = %p\n",__LINE__,_pStruct_); 181 182 /* ======================================================================= */ 183 /** 184 * @def G711ENC_MAX_NUM_OF_BUFS Maximum number of buffers 185 * @def G711ENC_NUM_OF_CHANNELS Number of Channels 186 * @def G711ENC_SAMPLING_FREQUENCY Sampling frequency 187 */ 188 /* ======================================================================= */ 189 #define G711ENC_MAX_NUM_OF_BUFS 10 190 #define G711ENC_NUM_OF_CHANNELS 1 191 #define G711ENC_SAMPLING_FREQUENCY 8000 192 193 int maxint(int a, int b); 194 195 int inputPortDisabled = 0; 196 int outputPortDisabled = 0; 197 OMX_BOOL playcompleted = 0; 198 199 OMX_STRING strG711Encoder = "OMX.TI.G711.encode"; 200 201 int IpBuf_Pipe[2] = {0}; 202 int OpBuf_Pipe[2] = {0}; 203 int Event_Pipe[2] = {0}; 204 205 OMX_STATETYPE gState = OMX_StateInvalid; 206 207 fd_set rfds; 208 static OMX_BOOL bInvalidState; 209 210 /******************************************************************************/ 211 OMX_S16 numInputBuffers = 0; 212 OMX_S16 numOutputBuffers = 0; 213 #ifdef USE_BUFFER 214 OMX_U8* pInputBuffer[10] = {NULL}; 215 OMX_U8* pOutputBuffer[10] = {NULL}; 216 #endif 217 OMX_BUFFERHEADERTYPE* pInputBufferHeader[10] = {NULL}; 218 OMX_BUFFERHEADERTYPE* pOutputBufferHeader[10] = {NULL}; 219 220 int timeToExit = 0; 221 /* RM control */ 222 int preempted = 0; 223 /******************************************************************************/ 224 225 OMX_ERRORTYPE send_input_buffer (OMX_HANDLETYPE pHandle, 226 OMX_BUFFERHEADERTYPE* pBuffer, 227 FILE *fIn); 228 /* safe routine to get the maximum of 2 integers */ 229 int maxint(int a, int b) 230 { 231 return (a>b) ? a : b; 232 } 233 234 /* This method will wait for the component to get to the state 235 * specified by the DesiredState input. */ 236 static OMX_ERRORTYPE WaitForState(OMX_HANDLETYPE pHandle, 237 OMX_STATETYPE DesiredState) 238 { 239 OMX_STATETYPE CurState = OMX_StateInvalid; 240 OMX_ERRORTYPE eError = OMX_ErrorNone; 241 242 eError = OMX_GetState(pHandle, &CurState); 243 if(eError != OMX_ErrorNone) { 244 APP_DPRINT("%d [TEST APP] Error returned from GetState\n",__LINE__); 245 return eError; 246 247 } 248 if(CurState != DesiredState){ 249 WaitForState_flag = 1; 250 TargetedState = DesiredState; 251 pthread_mutex_lock(&WaitForState_mutex); 252 pthread_cond_wait(&WaitForState_threshold, 253 &WaitForState_mutex); 254 pthread_mutex_unlock(&WaitForState_mutex); 255 } 256 257 return eError; 258 } 259 260 OMX_ERRORTYPE EventHandler(OMX_HANDLETYPE hComponent, 261 OMX_PTR pAppData, 262 OMX_EVENTTYPE eEvent, 263 OMX_U32 nData1, 264 OMX_U32 nData2, 265 OMX_PTR pEventData) 266 { 267 OMX_U8 writeValue = 0; 268 269 APP_DPRINT("%d [TEST APP] Component eEvent = %d\n", __LINE__,eEvent); 270 APP_DPRINT("%d [TEST APP] Entering EventHandler \n", __LINE__); 271 switch (eEvent) { 272 273 case OMX_EventCmdComplete: 274 gState = (OMX_STATETYPE)nData2; 275 APP_DPRINT( "%d [TEST APP] Component eEvent Completed = %d\n", __LINE__,eEvent); 276 if (nData1 == OMX_CommandPortDisable) { 277 if (nData2 == OMX_DirInput) { 278 inputPortDisabled = 1; 279 APP_DPRINT( "%d [TEST APP] Input Port disabled \n", __LINE__); 280 } 281 if (nData2 == OMX_DirOutput) { 282 outputPortDisabled = 1; 283 APP_DPRINT( "%d [TEST APP] output Port disabled \n", __LINE__); 284 } 285 } 286 if ((nData1 == OMX_CommandStateSet) && (TargetedState == nData2) && 287 (WaitForState_flag)){ 288 WaitForState_flag = 0; 289 pthread_mutex_lock(&WaitForState_mutex); 290 pthread_cond_signal(&WaitForState_threshold); 291 pthread_mutex_unlock(&WaitForState_mutex); 292 } 293 APP_DPRINT( "%d [TEST APP] Exit OMX_EventCmdComplete = %ld\n", __LINE__,nData2); 294 break; 295 296 case OMX_EventError: 297 printf( "%d [TEST APP] Enter to OMX_EventError = %d\n", __LINE__,eEvent); 298 299 if (nData1 == OMX_ErrorInvalidState) { 300 bInvalidState = OMX_TRUE; 301 } 302 else if(nData1 == OMX_ErrorResourcesPreempted) { 303 writeValue = 0; 304 preempted = 1; 305 write(Event_Pipe[1], &writeValue, sizeof(OMX_U8)); 306 } 307 else if (nData1 == OMX_ErrorResourcesLost) { 308 WaitForState_flag = 0; 309 pthread_mutex_lock(&WaitForState_mutex); 310 pthread_cond_signal(&WaitForState_threshold); 311 pthread_mutex_unlock(&WaitForState_mutex); 312 } 313 else if(nData1 == OMX_ErrorResourcesPreempted) { 314 writeValue = 0; 315 preempted = 1; 316 write(Event_Pipe[1], &writeValue, sizeof(OMX_U8)); 317 } 318 APP_DPRINT( "%d [TEST APP] Component OMX_EventError = %d\n", __LINE__,eEvent); 319 break; 320 321 case OMX_EventMax: 322 APP_DPRINT( "%d [TEST APP] Component OMX_EventMax = %d\n", __LINE__,eEvent); 323 break; 324 325 case OMX_EventMark: 326 APP_DPRINT( "%d [TEST APP] Component OMX_EventMark = %d\n", __LINE__,eEvent); 327 break; 328 329 case OMX_EventPortSettingsChanged: 330 APP_DPRINT( "%d [TEST APP] Component OMX_EventPortSettingsChanged = %d\n", __LINE__,eEvent); 331 break; 332 333 case OMX_EventBufferFlag: 334 if(nData2 == 0) 335 printf("EOS received from INPUT %ld %ld\n",nData1,nData2); 336 playcompleted = 1; 337 writeValue = 2; 338 write(Event_Pipe[1], &writeValue, sizeof(OMX_U8)); 339 APP_DPRINT( "%d [TEST APP] Component OMX_EventBufferFlag = %d\n", __LINE__,eEvent); 340 break; 341 342 case OMX_EventResourcesAcquired: 343 APP_DPRINT( "%d [TEST APP] Component OMX_EventResourcesAcquired = %d\n", __LINE__,eEvent); 344 writeValue = 1; 345 preempted = 0; 346 write(Event_Pipe[1], &writeValue, sizeof(OMX_U8)); 347 APP_DPRINT( "%d [TEST APP] Component OMX_EventResourcesAquired = %d\n", __LINE__,eEvent); 348 break; 349 350 default: 351 break; 352 353 } 354 return OMX_ErrorNone; 355 } 356 357 void FillBufferDone (OMX_HANDLETYPE hComponent, OMX_PTR ptr, OMX_BUFFERHEADERTYPE* pBuffer) 358 { 359 /*add on: TimeStamp & TickCount EmptyBufferDone*/ 360 TIME_PRINT("TimeStamp Output: %lld\n",pBuffer->nTimeStamp); 361 TICK_PRINT("TickCount Output: %ld\n\n",pBuffer->nTickCount); 362 write(OpBuf_Pipe[1], &pBuffer, sizeof(pBuffer)); 363 #ifdef OMX_GETTIME 364 if (GT_FlagF == 1 ){ /* First Buffer Reply*/ /* 1 = First Buffer, 0 = Not First Buffer */ 365 GT_END("Call to FillBufferDone <First: FillBufferDone>"); 366 GT_FlagF = 0 ; /* 1 = First Buffer, 0 = Not First Buffer */ 367 } 368 #endif 369 } 370 371 void EmptyBufferDone(OMX_HANDLETYPE hComponent, OMX_PTR ptr, OMX_BUFFERHEADERTYPE* pBuffer) 372 { 373 374 if (!preempted) { 375 write(IpBuf_Pipe[1], &pBuffer, sizeof(pBuffer)); 376 } 377 #ifdef OMX_GETTIME 378 if (GT_FlagE == 1 ){ /* First Buffer Reply*/ /* 1 = First Buffer, 0 = Not First Buffer */ 379 GT_END("Call to EmptyBufferDone <First: EmptyBufferDone>"); 380 GT_FlagE = 0; /* 1 = First Buffer, 0 = Not First Buffer */ 381 } 382 #endif 383 } 384 typedef struct G711ENC_FTYPES{ 385 OMX_S16 FrameSizeType; 386 OMX_S16 VAUMode; 387 OMX_S16 VAUThresOffset; 388 OMX_S16 VAUNum; 389 OMX_S16 NMUNoise; 390 OMX_S16 LPOrder; 391 }G711ENC_FTYPES; 392 /* ---------------------------------------------------------------------------- 393 * main() 394 * 395 * This function is called at application startup 396 * and drives the G711 Encoder OMX component 397 * ---------------------------------------------------------------------------- */ 398 int main(int argc, char* argv[]) 399 { 400 OMX_CALLBACKTYPE G711CaBa = {(void *)EventHandler, 401 (void*)EmptyBufferDone, 402 (void*)FillBufferDone}; 403 OMX_HANDLETYPE pHandle = NULL; 404 OMX_ERRORTYPE eError = OMX_ErrorNone; 405 OMX_U32 AppData = G711ENC_APP_ID; 406 OMX_PARAM_PORTDEFINITIONTYPE* pCompPrivateStruct = NULL; 407 OMX_AUDIO_PARAM_PCMMODETYPE *pG711Param = NULL; 408 OMX_BUFFERHEADERTYPE* pInputBufferHeader[G711ENC_MAX_NUM_OF_BUFS] = {NULL}; 409 OMX_BUFFERHEADERTYPE* pOutputBufferHeader[G711ENC_MAX_NUM_OF_BUFS] = {NULL}; 410 411 G711ENC_FTYPES *g711eframeinfo = malloc(sizeof(G711ENC_FTYPES)); 412 413 #ifdef USE_BUFFER 414 OMX_U8* pInputBuffer[G711ENC_MAX_NUM_OF_BUFS] = {NULL}; 415 OMX_U8* pOutputBuffer[G711ENC_MAX_NUM_OF_BUFS] = {NULL}; 416 #endif 417 AUDIO_INFO* audioinfo = NULL; 418 TI_OMX_DSP_DEFINITION tiOmxDspDefinition; 419 FILE* fIn = NULL; 420 FILE* fOut = NULL; 421 struct timeval tv; 422 int retval= 0, i= 0, j= 0, k= 0, kk= 0, tcID = 0; 423 int frmCount = 0; 424 int frmCnt = 1; 425 int testcnt = 1; 426 int testcnt1 = 1; 427 int fdmax = 0; 428 int nFrameCount = 1; 429 int nFrameLen = 0; 430 int nIpBuff = 1; 431 int nOutBuff = 1; 432 OMX_INDEXTYPE index = 0; 433 int status = 0; 434 TI_OMX_DATAPATH dataPath; 435 436 int G711E_fdwrite = 0; 437 int G711E_fdread = 0; 438 439 printf("------------------------------------------------------\n"); 440 printf("This is Main Thread In G711 ENCODER Test Application:\n"); 441 printf("Test Core 1.5 - " __DATE__ ":" __TIME__ "\n"); 442 printf("------------------------------------------------------\n"); 443 #ifdef OMX_GETTIME 444 printf("Line %d\n",__LINE__); 445 GTeError = OMX_ListCreate(&pListHead); 446 printf("Line %d\n",__LINE__); 447 printf("eError = %d\n",GTeError); 448 GT_START(); 449 printf("Line %d\n",__LINE__); 450 #endif 451 /* check the input parameters */ 452 if(argc != 18) { 453 printf("[TestApp] [Input File] [Output File] [FUNC_ID_X] [FM/DM] [ACDNO\ 454 N/ACDNOFF] [NB BUFFERS (DASF mode)] [NB INPUT BUF] [INPUT BUF SIZE] [NB OUTPUT \ 455 BUF] [OUTPUT BUF SIZE] [ALaw/MULaw] [Frame Size Type] [VAU Mode] [VAU OFFSET] [\ 456 VAU NUM] [NMU Mode] [LP Order]\n"); 457 goto EXIT; 458 } 459 460 pthread_mutex_init(&WaitForState_mutex, NULL); 461 pthread_cond_init (&WaitForState_threshold, NULL); 462 463 /* check to see that the input file exists */ 464 struct stat sb = {0}; 465 status = stat(argv[1], &sb); 466 if( status != 0 ) { 467 printf("Cannot find file %s. (%u)\n", argv[1], errno); 468 goto EXIT; 469 } 470 471 if(!strcmp(argv[3],"FUNC_ID_1")) { 472 printf("### Testing TESTCASE 1 PLAY TILL END ###\n"); 473 tcID = 1; 474 } else if(!strcmp(argv[3],"FUNC_ID_2")) { 475 printf("### Testing TESTCASE 2 STOP IN THE END ###\n"); 476 tcID = 2; 477 } else if(!strcmp(argv[3],"FUNC_ID_3")) { 478 printf("### Testing TESTCASE 3 PAUSE - RESUME IN BETWEEN ###\n"); 479 tcID = 3; 480 } else if(!strcmp(argv[3],"FUNC_ID_4")) { 481 printf("### Testing TESTCASE 4 STOP IN BETWEEN ###\n"); 482 testcnt = 2; 483 tcID = 4; 484 } 485 if(!strcmp(argv[3],"FUNC_ID_5")){ 486 printf("### Testing TESTCASE 5 ENCODE without Deleting component Here ###\n"); 487 testcnt = 20; 488 tcID = 5; 489 } 490 if(!strcmp(argv[3],"FUNC_ID_6")) { 491 printf("### Testing TESTCASE 6 ENCODE with Deleting component Here ###\n"); 492 testcnt1 = 20; 493 tcID = 6; 494 } 495 496 /*---------------------------------------------- 497 Main Loop for Deleting component test 498 ----------------------------------------------*/ 499 for(j = 0; j < testcnt1; j++) { 500 if(tcID == 6) 501 printf ("Encoding the file for %d Time in TESTCASE 6\n",j); 502 503 /* Open communication with Audio manger */ 504 #ifdef DSP_RENDERING_ON 505 if((G711E_fdwrite=open(FIFO1,O_WRONLY))<0) { 506 printf("APP: - failure to open WRITE pipe\n"); 507 } 508 else { 509 APP_DPRINT("APP: - opened WRITE pipe\n"); 510 } 511 512 if((G711E_fdread=open(FIFO2,O_RDONLY))<0) { 513 printf("APP: - failure to open READ pipe\n"); 514 goto EXIT; 515 } 516 else { 517 APP_DPRINT("APP: - opened READ pipe\n"); 518 } 519 #endif 520 /* Create a pipe used to queue data from the callback. */ 521 retval = pipe(IpBuf_Pipe); 522 if( retval != 0) { 523 APP_DPRINT("Error:Fill Data Pipe failed to open\n"); 524 goto EXIT; 525 } 526 527 retval = pipe(OpBuf_Pipe); 528 if( retval != 0) { 529 APP_DPRINT("Error:Empty Data Pipe failed to open\n"); 530 goto EXIT; 531 } 532 retval = pipe(Event_Pipe); 533 if( retval != 0) { 534 APP_DPRINT( "%d %s Error: Empty Data Pipe failed to open\n",__LINE__, __FUNCTION__); 535 goto EXIT; 536 } 537 /* save off the "max" of the handles for the selct statement */ 538 fdmax = maxint(IpBuf_Pipe[0], OpBuf_Pipe[0]); 539 fdmax = maxint(fdmax,Event_Pipe[0]); 540 541 eError = TIOMX_Init(); 542 if(eError != OMX_ErrorNone) { 543 APP_DPRINT("%d Error returned by OMX_Init()\n",__LINE__); 544 goto EXIT; 545 } 546 547 /* Load the G711 Encoder Component */ 548 #ifdef OMX_GETTIME 549 GT_START(); 550 eError = OMX_GetHandle(&pHandle, strG711Encoder, &AppData, &G711CaBa); 551 GT_END("Call to GetHandle"); 552 #else 553 eError = TIOMX_GetHandle(&pHandle, strG711Encoder, &AppData, &G711CaBa); 554 #endif 555 556 if((eError != OMX_ErrorNone) || (pHandle == NULL)) { 557 APP_DPRINT("Error in Get Handle function\n"); 558 goto EXIT; 559 } 560 APP_DPRINT("%d [TEST APP] Got Phandle = %p \n",__LINE__,pHandle); 561 562 OMX_G711ENC_MALLOC_STRUCT(audioinfo, AUDIO_INFO); 563 OMX_G711ENC_INIT_STRUCT(audioinfo, AUDIO_INFO); 564 565 /* Setting Input and Output Buffers features for the Component */ 566 audioinfo->nIpBufs = atoi(argv[7]); 567 if(audioinfo->nIpBufs > 4 && audioinfo->nIpBufs < 1){ 568 APP_DPRINT( "Cannot support %li Input buffers\n", audioinfo->nIpBufs); 569 goto EXIT; 570 } 571 APP_DPRINT("%d [TEST APP] number of input buffers = %ld \n",__LINE__,audioinfo->nIpBufs); 572 audioinfo->nIpBufSize = atoi(argv[8]); 573 APP_DPRINT("%d [TEST APP] input buffer size = %ld \n",__LINE__,audioinfo->nIpBufSize); 574 audioinfo->nOpBufs = atoi(argv[9]); 575 if(audioinfo->nOpBufs > 4){ 576 APP_DPRINT( "Cannot support %ld Output buffers\n", audioinfo->nOpBufs); 577 goto EXIT; 578 } 579 APP_DPRINT("%d [TEST APP] number of output buffers = %ld \n",__LINE__,audioinfo->nOpBufs); 580 audioinfo->nOpBufSize = atoi(argv[10]); 581 APP_DPRINT("%d [TEST APP] output buffer size = %ld \n",__LINE__,audioinfo->nOpBufSize); 582 583 584 OMX_G711ENC_MALLOC_STRUCT(pCompPrivateStruct, OMX_PARAM_PORTDEFINITIONTYPE); 585 OMX_G711ENC_CONF_INIT_STRUCT(pCompPrivateStruct, OMX_PARAM_PORTDEFINITIONTYPE); 586 587 pCompPrivateStruct->nPortIndex = OMX_DirInput; 588 eError = OMX_GetParameter (pHandle, 589 OMX_IndexParamPortDefinition, 590 pCompPrivateStruct); 591 if (eError != OMX_ErrorNone) { 592 eError = OMX_ErrorBadParameter; 593 APP_DPRINT("%d OMX_ErrorBadParameter\n",__LINE__); 594 goto EXIT; 595 } 596 APP_DPRINT("%d Setting input port config\n",__LINE__); 597 pCompPrivateStruct->nBufferCountActual = audioinfo->nIpBufs; 598 pCompPrivateStruct->nBufferCountMin = audioinfo->nIpBufs; 599 pCompPrivateStruct->nBufferSize = audioinfo->nIpBufSize; 600 601 602 #ifdef OMX_GETTIME 603 GT_START(); 604 eError = OMX_SetParameter (pHandle, OMX_IndexParamPortDefinition, pCompPrivateStruct); 605 GT_END("Set Parameter Test-SetParameter"); 606 #else 607 eError = OMX_SetParameter (pHandle, OMX_IndexParamPortDefinition, pCompPrivateStruct); 608 #endif 609 610 if (eError != OMX_ErrorNone) { 611 eError = OMX_ErrorBadParameter; 612 APP_DPRINT("%d OMX_ErrorBadParameter\n",__LINE__); 613 goto EXIT; 614 } 615 616 if(!(strcmp(argv[4],"FM"))) { 617 audioinfo->dasfMode = 0; 618 tiOmxDspDefinition.dasfMode = OMX_FALSE; 619 APP_DPRINT("%d G711 ENCODER RUNNING UNDER FILE MODE \n",__LINE__); 620 621 } else if(!(strcmp(argv[4],"DM"))){ 622 audioinfo->dasfMode = 1; 623 tiOmxDspDefinition.dasfMode = OMX_TRUE; 624 APP_DPRINT("%d G711 ENCODER RUNNING UNDER DASF MODE \n",__LINE__); 625 626 } else { 627 eError = OMX_ErrorBadParameter; 628 printf("\n%d [TEST APP] audioinfo->dasfMode Sending Bad Parameter\n",__LINE__); 629 printf("%d [TEST APP] Should Be One of these Modes FM, DM\n",__LINE__); 630 goto EXIT; 631 } 632 633 if(audioinfo->dasfMode == 0) { 634 if((atoi(argv[6])) != 0) { 635 eError = OMX_ErrorBadParameter; 636 printf("\n%d [TEST APP] No. of Buffers Sending Bad Parameter\n",__LINE__); 637 printf("%d [TEST APP] For FILE mode argv[6] Should Be --> 0\n",__LINE__); 638 printf("%d [TEST APP] For DASF mode argv[6] Should be greater than zero depends on number of buffers user want to encode\n",__LINE__); 639 goto EXIT; 640 } 641 } else { 642 if((atoi(argv[6])) == 0) { 643 eError = OMX_ErrorBadParameter; 644 printf("\n%d [TEST APP] No. of Buffers Sending Bad Parameter\n",__LINE__); 645 printf("%d [TEST APP] For DASF mode argv[6] Should be greater than zero depends on number of buffers user want to encode\n",__LINE__); 646 printf("%d [TEST APP] For FILE mode argv[6] Should Be --> 0\n",__LINE__); 647 goto EXIT; 648 } 649 } 650 651 if(!(strcmp(argv[5],"ACDNOFF"))) { 652 audioinfo->acdnMode = 0; 653 tiOmxDspDefinition.acousticMode = OMX_FALSE; 654 APP_DPRINT("\n%d [TEST APP] audioinfo->acdnMode = %ld \n",__LINE__,audioinfo->acdnMode); 655 } else if(!(strcmp(argv[5],"ACDNON"))) { 656 audioinfo->acdnMode = 1; 657 tiOmxDspDefinition.acousticMode = OMX_TRUE; 658 APP_DPRINT("\n%d [TEST APP] audioinfo->acdnMode = %ld \n",__LINE__,audioinfo->acdnMode); 659 } else { 660 eError = OMX_ErrorBadParameter; 661 printf("\n%d [TEST APP] audioinfo->acdnMode Sending Bad Parameter\n",__LINE__); 662 printf("%d [TEST APP] Should Be One of these Modes ACDNON, ACDNOFF\n",__LINE__); 663 goto EXIT; 664 } 665 666 667 pCompPrivateStruct->nPortIndex = OMX_DirOutput; 668 eError = OMX_GetParameter (pHandle, 669 OMX_IndexParamPortDefinition, 670 pCompPrivateStruct); 671 if (eError != OMX_ErrorNone) { 672 eError = OMX_ErrorBadParameter; 673 APP_DPRINT("%d OMX_ErrorBadParameter\n",__LINE__); 674 goto EXIT; 675 } 676 677 APP_MEMPRINT("%d Setting output port config\n",__LINE__); 678 pCompPrivateStruct->nBufferCountActual = audioinfo->nOpBufs; 679 pCompPrivateStruct->nBufferCountMin = audioinfo->nOpBufs; 680 pCompPrivateStruct->nBufferSize = audioinfo->nOpBufSize; 681 682 #ifdef OMX_GETTIME 683 GT_START(); 684 eError = OMX_SetParameter (pHandle, OMX_IndexParamPortDefinition, pCompPrivateStruct); 685 GT_END("Set Parameter Test-SetParameter"); 686 #else 687 eError = OMX_SetParameter (pHandle, OMX_IndexParamPortDefinition, pCompPrivateStruct); 688 #endif 689 if (eError != OMX_ErrorNone) { 690 eError = OMX_ErrorBadParameter; 691 APP_DPRINT("%d OMX_ErrorBadParameter\n",__LINE__); 692 goto EXIT; 693 } 694 695 OMX_G711ENC_MALLOC_STRUCT(pG711Param, OMX_AUDIO_PARAM_PCMMODETYPE); 696 OMX_G711ENC_CONF_INIT_STRUCT(pG711Param, OMX_AUDIO_PARAM_PCMMODETYPE); 697 698 /* Send G711 config for output */ 699 pG711Param->nPortIndex = OMX_DirOutput; 700 eError = OMX_GetParameter (pHandle, OMX_IndexParamAudioPcm, pG711Param); 701 if (eError != OMX_ErrorNone) { 702 APP_DPRINT("%d Get paramter reported %d\n",__LINE__,eError); 703 goto EXIT; 704 } 705 706 pG711Param->nChannels = G711ENC_NUM_OF_CHANNELS; 707 708 /* extract compression format from command line */ 709 if (!(strcmp(argv[11],"ALaw"))) 710 pG711Param->ePCMMode = OMX_AUDIO_PCMModeALaw; 711 else if (!(strcmp(argv[11],"MULaw"))) 712 pG711Param->ePCMMode = OMX_AUDIO_PCMModeMULaw; 713 else { 714 printf("\n%d [TEST APP] Bad Parameter: \n",__LINE__); 715 printf("%d [TEST APP] Please enter proper G711 mode: ALaw or MULaw\n",__LINE__); 716 goto EXIT; 717 } 718 #ifdef OMX_GETTIME 719 GT_START(); 720 eError = OMX_SetParameter (pHandle, OMX_IndexParamAudioPcm, pG711Param); 721 GT_END("Set Parameter Test-SetParameter"); 722 #else 723 eError = OMX_SetParameter (pHandle, OMX_IndexParamAudioPcm, pG711Param); 724 #endif 725 if (eError != OMX_ErrorNone) { 726 eError = OMX_ErrorBadParameter; 727 APP_DPRINT("%d OMX_ErrorBadParameter\n",__LINE__); 728 goto EXIT; 729 } 730 731 /* Send G711 config for input */ 732 pG711Param->nPortIndex = OMX_DirInput; 733 eError = OMX_GetParameter (pHandle,OMX_IndexParamAudioPcm, pG711Param); 734 if (eError != OMX_ErrorNone) { 735 eError = OMX_ErrorBadParameter; 736 printf ("%d [TEST APP] OMX_ErrorBadParameter\n",__LINE__); 737 goto EXIT; 738 } 739 740 #ifdef OMX_GETTIME 741 GT_START(); 742 eError = OMX_SetParameter (pHandle,OMX_IndexParamAudioPcm, pG711Param); 743 GT_END("Set Parameter Test-SetParameter"); 744 #else 745 eError = OMX_SetParameter (pHandle,OMX_IndexParamAudioPcm, pG711Param); 746 #endif 747 if (eError != OMX_ErrorNone) { 748 eError = OMX_ErrorBadParameter; 749 printf ("%d [TEST APP] OMX_ErrorBadParameter\n",__LINE__); 750 goto EXIT; 751 } 752 753 /** Getting the frame params */ 754 g711eframeinfo->FrameSizeType = atoi(argv[12]); 755 g711eframeinfo->VAUMode = atoi(argv[13]); 756 g711eframeinfo->VAUThresOffset = atoi(argv[14]); 757 g711eframeinfo->VAUNum = atoi(argv[15]); 758 g711eframeinfo->NMUNoise = atoi(argv[16]); 759 g711eframeinfo->LPOrder = atoi(argv[17]); 760 761 eError = OMX_GetExtensionIndex(pHandle, "OMX.TI.index.config.g711.frameparamters",&index); 762 if (eError != OMX_ErrorNone) { 763 printf("Error getting extension index\n"); 764 goto EXIT; 765 } 766 767 eError = OMX_SetConfig (pHandle, index, g711eframeinfo); 768 if(eError != OMX_ErrorNone) { 769 eError = OMX_ErrorBadParameter; 770 APP_DPRINT("%d Error from OMX_SetConfig() function\n",__LINE__); 771 goto EXIT; 772 } 773 774 775 eError = OMX_GetExtensionIndex(pHandle, "OMX.TI.index.config.tispecific",&index); 776 if (eError != OMX_ErrorNone) { 777 APP_DPRINT("Error returned from OMX_GetExtensionIndex\n"); 778 goto EXIT; 779 } 780 781 #ifdef DSP_RENDERING_ON 782 if((write(G711E_fdwrite, &cmd_data, sizeof(cmd_data)))<0) { 783 printf("%d [TEST APP] - failure to send command to audio manager\n", __LINE__); 784 goto EXIT; 785 } 786 if((read(G711E_fdread, &cmd_data, sizeof(cmd_data)))<0) { 787 printf("%d [TEST APP] - failure to get data from the audio manager\n", __LINE__); 788 goto EXIT; 789 } 790 #endif 791 792 eError = OMX_SetConfig (pHandle, index, &tiOmxDspDefinition); 793 if(eError != OMX_ErrorNone) { 794 eError = OMX_ErrorBadParameter; 795 APP_DPRINT("%d Error from OMX_SetConfig() function\n",__LINE__); 796 goto EXIT; 797 } 798 799 /* Data path for DASF */ 800 if (audioinfo->dasfMode) { 801 printf("***************StreamId=%d******************\n", (int)tiOmxDspDefinition.streamId); 802 #ifdef RTM_PATH 803 dataPath = DATAPATH_APPLICATION_RTMIXER; 804 #endif 805 806 #ifdef ETEEDN_PATH 807 dataPath = DATAPATH_APPLICATION; 808 #endif 809 } 810 811 eError = OMX_GetExtensionIndex(pHandle, "OMX.TI.index.config.g711.datapath",&index); 812 if (eError != OMX_ErrorNone) { 813 printf("Error getting extension index\n"); 814 goto EXIT; 815 } 816 817 eError = OMX_SetConfig (pHandle, index, &dataPath); 818 if(eError != OMX_ErrorNone) { 819 eError = OMX_ErrorBadParameter; 820 APP_DPRINT("%d G711EencTest.c :: Error from OMX_SetConfig() function\n",__LINE__); 821 goto EXIT; 822 } 823 824 #ifdef OMX_GETTIME 825 GT_START(); 826 #endif 827 eError = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StateIdle, NULL); 828 if(eError != OMX_ErrorNone) { 829 APP_DPRINT("Error from SendCommand-Idle(Init) State function\n"); 830 goto EXIT; 831 } 832 #ifndef USE_BUFFER 833 if(!audioinfo->dasfMode){ 834 for(i = 0; i < audioinfo->nIpBufs; i++) { 835 /* allocate input buffer */ 836 APP_DPRINT("%d About to call OMX_AllocateBuffer for pInputBufferHeader[%d]\n\n",__LINE__, i); 837 eError = OMX_AllocateBuffer(pHandle, &pInputBufferHeader[i], 0, NULL, audioinfo->nIpBufSize); 838 if(eError != OMX_ErrorNone) { 839 APP_DPRINT("%d Error returned by OMX_AllocateBuffer for pInputBufferHeader[%d]\n",__LINE__, i); 840 goto EXIT; 841 } 842 } 843 } 844 845 for(i = 0; i < audioinfo->nOpBufs; i++) { 846 /* allocate output buffer */ 847 APP_DPRINT("%d About to call OMX_AllocateBuffer for pOutputBufferHeader[%d]\n\n",__LINE__, i); 848 eError = OMX_AllocateBuffer(pHandle, &pOutputBufferHeader[i], 1, NULL, pCompPrivateStruct->nBufferSize); 849 if(eError != OMX_ErrorNone) { 850 APP_DPRINT("%d Error returned by OMX_AllocateBuffer for pOutputBufferHeader[%d]\n",__LINE__, i); 851 goto EXIT; 852 } 853 } 854 #else 855 if(!audioinfo->dasfMode){ 856 for(i = 0; i < audioinfo->nIpBufs; i++) { 857 pInputBuffer[i] = (OMX_U8*)malloc(audioinfo->nIpBufSize); 858 APP_MEMPRINT("%d [TESTAPP ALLOC] pInputBuffer[%d] = %p\n",__LINE__,i,pInputBuffer[i]); 859 if(NULL == pInputBuffer[i]) { 860 APP_DPRINT("%d Malloc Failed\n",__LINE__); 861 eError = OMX_ErrorInsufficientResources; 862 goto EXIT; 863 } 864 /* allocate input buffer */ 865 APP_DPRINT("%d About to call OMX_UseBuffer\n",__LINE__); 866 eError = OMX_UseBuffer(pHandle, &pInputBufferHeader[i], 0, NULL, audioinfo->nIpBufSize, pInputBuffer[i]); 867 if(eError != OMX_ErrorNone) { 868 APP_DPRINT("%d Error returned by OMX_UseBuffer()\n",__LINE__); 869 goto EXIT; 870 } 871 } 872 } 873 for(i = 0; i < audioinfo->nOpBufs; i++) { 874 pOutputBuffer[i] = malloc (pCompPrivateStruct->nBufferSize + 256); 875 APP_MEMPRINT("%d [TESTAPP ALLOC] pOutputBuffer[%d] = %p\n",__LINE__,i,pOutputBuffer[i]); 876 if(NULL == pOutputBuffer[i]) { 877 APP_DPRINT("%d Malloc Failed\n",__LINE__); 878 eError = OMX_ErrorInsufficientResources; 879 goto EXIT; 880 } 881 pOutputBuffer[i] = pOutputBuffer[i] + 128; 882 883 /* allocate output buffer */ 884 APP_DPRINT("%d About to call OMX_UseBuffer\n",__LINE__); 885 eError = OMX_UseBuffer(pHandle, &pOutputBufferHeader[i], 1, NULL, pCompPrivateStruct->nBufferSize, pOutputBuffer[i]); 886 if(eError != OMX_ErrorNone) { 887 APP_DPRINT("%d Error returned by OMX_UseBuffer()\n",__LINE__); 888 goto EXIT; 889 } 890 } 891 #endif 892 /* Wait for startup to complete */ 893 eError = WaitForState(pHandle, OMX_StateIdle); 894 #ifdef OMX_GETTIME 895 GT_END("Call to SendCommand <OMX_StateIdle>"); 896 #endif 897 if(eError != OMX_ErrorNone) { 898 APP_DPRINT( "Error: G711Encoder->WaitForState reports an eError %X\n", eError); 899 goto EXIT; 900 } 901 902 903 /*---------------------------------------------- 904 Main Loop for Non Deleting component test 905 ----------------------------------------------*/ 906 for(i = 0; i < testcnt; i++) { 907 if(tcID == 5) 908 printf ("Encoding the file for %d Time in TESTCASE 5\n",i); 909 910 if(i > 0){ 911 /* Create a pipe used to queue data from the callback. */ 912 retval = pipe(IpBuf_Pipe); 913 if( retval != 0) { 914 APP_DPRINT( "%d APP: Error: Fill Data Pipe failed to open\n",__LINE__); 915 goto EXIT; 916 } 917 retval = pipe(OpBuf_Pipe); 918 if( retval != 0) { 919 APP_DPRINT( "%d APP: Error: Empty Data Pipe failed to open\n",__LINE__); 920 goto EXIT; 921 } 922 retval = pipe(Event_Pipe); 923 if( retval != 0) { 924 APP_DPRINT( "%d APP: Error: Event Pipe failed to open\n",__LINE__); 925 goto EXIT; 926 } 927 } 928 929 frmCnt = 1; 930 nFrameCount = 1; 931 nOutBuff = 1; 932 nIpBuff = 1; 933 934 fIn = fopen(argv[1], "r"); 935 if( fIn == NULL ) { 936 fprintf(stderr, "Error: failed to open the file %s for read only access\n",argv[1]); 937 goto EXIT; 938 } 939 fOut = fopen(argv[2], "w"); 940 if( fOut == NULL ) { 941 printf("Error: failed to open the output file %s\n", argv[2]); 942 goto EXIT; 943 } 944 APP_DPRINT("%d [TEST APP] Sending OMX_StateExecuting Command\n",__LINE__); 945 #ifdef OMX_GETTIME 946 GT_START(); 947 #endif 948 eError = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StateExecuting, NULL); 949 if(eError != OMX_ErrorNone) { 950 printf("Error from SendCommand-Executing State function\n"); 951 goto EXIT; 952 } 953 eError = WaitForState(pHandle, OMX_StateExecuting); 954 #ifdef OMX_GETTIME 955 GT_END("Call to SendCommand <OMX_StateExecuting>"); 956 #endif 957 if(eError != OMX_ErrorNone) { 958 APP_DPRINT( "Error: G711Encoder->WaitForState reports an eError %X\n", eError); 959 goto EXIT; 960 } 961 962 if(audioinfo->dasfMode == 1) { 963 printf("%d [TEST APP] No.of Buffers Encoding = %d\n",__LINE__, atoi(argv[6])); 964 } 965 966 if(audioinfo->dasfMode == 0) { 967 for (k=0; k < audioinfo->nIpBufs; k++) { 968 #ifdef OMX_GETTIME 969 if (k==0){ 970 GT_FlagE=1; /* 1 = First Buffer, 0 = Not First Buffer */ 971 GT_START(); /* Empty Bufffer */ 972 } 973 #endif 974 send_input_buffer(pHandle,pInputBufferHeader[k],fIn); 975 nIpBuff++; 976 } 977 } 978 979 for (kk = 0; kk < audioinfo->nOpBufs; kk++) { 980 APP_DPRINT("%d [TEST APP] Calling OMX_FillThisBuffer \n",__LINE__); 981 #ifdef OMX_GETTIME 982 if (kk==0){ 983 GT_FlagF=1; /* 1 = First Buffer, 0 = Not First Buffer */ 984 GT_START(); /* Fill Buffer */ 985 } 986 #endif 987 OMX_FillThisBuffer(pHandle, pOutputBufferHeader[kk]); 988 } 989 990 while((eError == OMX_ErrorNone) && (gState != OMX_StateIdle) && 991 (gState != OMX_StateInvalid)) { 992 993 FD_ZERO(&rfds); 994 FD_SET(IpBuf_Pipe[0], &rfds); 995 FD_SET(OpBuf_Pipe[0], &rfds); 996 FD_SET(Event_Pipe[0], &rfds); 997 998 tv.tv_sec = 1; 999 tv.tv_usec = 0; 1000 frmCount++; 1001 1002 retval = select(fdmax+1, &rfds, NULL, NULL, &tv); 1003 if(retval == -1) { 1004 perror("select()"); 1005 APP_DPRINT( " :: Error \n"); 1006 break; 1007 } 1008 1009 if(retval == 0) { 1010 APP_DPRINT("%d BasicFn App Timeout !!!!!!!!!!! \n",__LINE__); 1011 } 1012 1013 switch (tcID) { 1014 case 1: 1015 case 2: 1016 case 5: 1017 case 6: 1018 if(audioinfo->dasfMode == 0) { 1019 if(FD_ISSET(IpBuf_Pipe[0], &rfds)) { 1020 OMX_BUFFERHEADERTYPE* pBuffer; 1021 read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer)); 1022 pBuffer->nFlags = 0; 1023 send_input_buffer(pHandle,pBuffer,fIn); 1024 nIpBuff++; 1025 } 1026 if(tcID == 2 && nIpBuff == 200) { 1027 printf("%d [TEST APP] Sending Stop.........From APP\n",__LINE__); 1028 printf("%d [TEST APP] Shutting down ---------- \n",__LINE__); 1029 #ifdef OMX_GETTIME 1030 GT_START(); 1031 #endif 1032 eError = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL); 1033 if(eError != OMX_ErrorNone) { 1034 fprintf (stderr,"Error from SendCommand-Idle(Stop) State function\n"); 1035 goto EXIT; 1036 } 1037 eError = WaitForState(pHandle, OMX_StateIdle); 1038 #ifdef OMX_GETTIME 1039 GT_END("Call to SendCommand <OMX_StateIdle>"); 1040 #endif 1041 if (eError != OMX_ErrorNone ){ 1042 printf("Error:WaitForState has timed out %d", eError); 1043 goto EXIT; 1044 } 1045 } 1046 } else { 1047 APP_DPRINT("%d G711 ENCODER RUNNING UNDER DASF MODE \n",__LINE__); 1048 if(nFrameCount == atoi(argv[6])) { 1049 APP_DPRINT("%d [TEST APP] Sending Stop.........From APP \n",__LINE__); 1050 APP_DPRINT("%d [TEST APP] Shutting down ---------- \n",__LINE__); 1051 #ifdef OMX_GETTIME 1052 GT_START(); 1053 #endif 1054 eError = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL); 1055 if(eError != OMX_ErrorNone) { 1056 fprintf (stderr,"Error from SendCommand-Idle(Stop) State function\n"); 1057 goto EXIT; 1058 } 1059 eError = WaitForState(pHandle, OMX_StateIdle); 1060 #ifdef OMX_GETTIME 1061 GT_END("Call to SendCommand <OMX_StateIdle>"); 1062 #endif 1063 if ( eError != OMX_ErrorNone ){ 1064 printf("Error:WaitForState has timed out %d", eError); 1065 goto EXIT; 1066 } 1067 } 1068 APP_DPRINT("%d G711 ENCODER READING DATA FROM DASF \n",__LINE__); 1069 } 1070 break; 1071 1072 case 3: 1073 if(audioinfo->dasfMode == 0) { 1074 APP_DPRINT("%d G711 ENCODER RUNNING UNDER FILE 2 FILE MODE \n",__LINE__); 1075 if(FD_ISSET(IpBuf_Pipe[0], &rfds)) { 1076 OMX_BUFFERHEADERTYPE* pBuffer; 1077 read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer)); 1078 pBuffer->nFlags = 0; 1079 send_input_buffer(pHandle,pBuffer,fIn); 1080 } 1081 } else { 1082 APP_DPRINT("%d G711 ENCODER RUNNING UNDER DASF MODE \n",__LINE__); 1083 if(nFrameCount == atoi(argv[6])) { 1084 printf("%d [TEST APP] Sending Stop.........From APP \n",__LINE__); 1085 printf("%d [TEST APP] Shutting down ---------- \n",__LINE__); 1086 #ifdef OMX_GETTIME 1087 GT_START(); 1088 #endif 1089 eError = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL); 1090 if(eError != OMX_ErrorNone) { 1091 fprintf (stderr,"Error from SendCommand-Idle(Stop) State function\n"); 1092 goto EXIT; 1093 } 1094 eError = WaitForState(pHandle, OMX_StateIdle); 1095 #ifdef OMX_GETTIME 1096 GT_END("Call to SendCommand <OMX_StateIdle>"); 1097 #endif 1098 if (eError != OMX_ErrorNone ){ 1099 printf("Error:WaitForState has timed out %d", eError); 1100 goto EXIT; 1101 } 1102 } 1103 APP_DPRINT("%d G711 ENCODER READING DATA FROM DASF \n",__LINE__); 1104 } 1105 if (frmCount == 15) { 1106 printf ("%d [TEST APP] $$$$$ Sending Resume command to Codec $$$$$$$\n",__LINE__); 1107 #ifdef OMX_GETTIME 1108 GT_START(); 1109 #endif 1110 eError = OMX_SendCommand(pHandle, OMX_CommandStateSet,OMX_StateExecuting, NULL); 1111 if(eError != OMX_ErrorNone) { 1112 fprintf (stderr,"Error from SendCommand-Executing State function\n"); 1113 goto EXIT; 1114 } 1115 /* Wait for startup to complete */ 1116 eError = WaitForState(pHandle, OMX_StateExecuting); 1117 #ifdef OMX_GETTIME 1118 GT_END("Call to SendCommand <OMX_StateExecuting>"); 1119 #endif 1120 if(eError != OMX_ErrorNone) { 1121 fprintf(stderr, "Error: hPcmDecoder->WaitForState reports an eError %X\n", eError); 1122 goto EXIT; 1123 } 1124 } 1125 if(frmCount == 10) { 1126 printf ("%d [TEST APP] $$$$$ Sending Pause command to Codec $$$$$$\n",__LINE__); 1127 #ifdef OMX_GETTIME 1128 GT_START(); 1129 #endif 1130 eError = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StatePause, NULL); 1131 if(eError != OMX_ErrorNone) { 1132 printf("Error from SendCommand-Pasue State function\n"); 1133 goto EXIT; 1134 } 1135 /* Wait for startup to complete */ 1136 eError = WaitForState(pHandle, OMX_StatePause); 1137 #ifdef OMX_GETTIME 1138 GT_END("Call to SendCommand <OMX_StatePause>"); 1139 #endif 1140 if(eError != OMX_ErrorNone) { 1141 printf("G711Encoder->WaitForState reports error\n"); 1142 goto EXIT; 1143 } 1144 } 1145 break; 1146 case 4: 1147 if(audioinfo->dasfMode == 0) { 1148 APP_DPRINT("%d G711 ENCODER RUNNING UNDER FILE 2 FILE MODE \n",__LINE__); 1149 if( FD_ISSET(IpBuf_Pipe[0], &rfds) ) { 1150 if(frmCnt > 20) { 1151 printf("Stop Playback......\n"); 1152 eError = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StateIdle, NULL); 1153 if(eError != OMX_ErrorNone) { 1154 printf("Error from SendCommand-Pasue State function\n"); 1155 goto EXIT; 1156 } 1157 eError = WaitForState(pHandle, OMX_StateIdle); 1158 if(eError != OMX_ErrorNone) { 1159 printf("G711Encoder->WaitForState reports error\n"); 1160 goto EXIT; 1161 } 1162 sleep(2); 1163 printf("Resume Playback.....\n"); 1164 tcID = 1; 1165 frmCnt++; 1166 } else { 1167 OMX_BUFFERHEADERTYPE* pBuffer; 1168 read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer)); 1169 pBuffer->nFlags = 0; 1170 send_input_buffer(pHandle,pBuffer,fIn); 1171 } 1172 } 1173 frmCnt++; 1174 } else { 1175 APP_DPRINT("%d G711 ENCODER RUNNING UNDER DASF MODE \n",__LINE__); 1176 if(nFrameCount == atoi(argv[6])) { 1177 printf("%d [TEST APP] Shutting down ---------- \n",__LINE__); 1178 #ifdef OMX_GETTIME 1179 GT_START(); 1180 #endif 1181 1182 eError = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL); 1183 if(eError != OMX_ErrorNone) { 1184 printf("Error from SendCommand-Idle(Stop) State function\n"); 1185 goto EXIT; 1186 } 1187 eError = WaitForState(pHandle, OMX_StateIdle); 1188 #ifdef OMX_GETTIME 1189 GT_END("Call to SendCommand <OMX_StateIdle>"); 1190 #endif 1191 if (eError != OMX_ErrorNone ){ 1192 printf("Error:WaitForState has timed out %d", eError); 1193 goto EXIT; 1194 } 1195 } 1196 if(nFrameCount == 20) { 1197 printf("%d [TEST APP] Sending Stop After %d frames \n",__LINE__,nFrameCount); 1198 #ifdef OMX_GETTIME 1199 GT_START(); 1200 #endif 1201 eError = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL); 1202 if(eError != OMX_ErrorNone) { 1203 printf("Error from SendCommand-Idle(Stop) State function\n"); 1204 goto EXIT; 1205 } 1206 eError = WaitForState(pHandle, OMX_StateIdle); 1207 #ifdef OMX_GETTIME 1208 GT_END("Call to SendCommand <OMX_StateIdle>"); 1209 #endif 1210 if (eError != OMX_ErrorNone ){ 1211 printf("Error:WaitForState has timed out %d", eError); 1212 goto EXIT; 1213 } 1214 } 1215 } 1216 break; 1217 default: 1218 APP_DPRINT("%d ### Simple DEFAULT Case Here ###\n",__LINE__); 1219 } 1220 1221 if( FD_ISSET(OpBuf_Pipe[0], &rfds) ) { 1222 OMX_BUFFERHEADERTYPE* pBuf; 1223 read(OpBuf_Pipe[0], &pBuf, sizeof(pBuf)); 1224 APP_DPRINT("%d [TEST APP] pBuf->nFilledLen = %ld\n",__LINE__, pBuf->nFilledLen); 1225 nFrameLen = pBuf->nFilledLen; 1226 if (nFrameLen != 0) { 1227 APP_DPRINT("%d Writing OutputBuffer No: %d to the file nWrite = %d \n",__LINE__, nOutBuff, nFrameLen); 1228 fwrite(pBuf->pBuffer, 1, pBuf->nFilledLen, fOut); 1229 fflush(fOut); 1230 } 1231 nFrameCount++; 1232 nOutBuff++; 1233 OMX_FillThisBuffer(pHandle, pBuf); 1234 APP_DPRINT("%d [TEST APP] pBuf->nFlags = %ld\n",__LINE__, pBuf->nFlags); 1235 } 1236 if( FD_ISSET(Event_Pipe[0], &rfds) ) { 1237 OMX_U8 pipeContents; 1238 read(Event_Pipe[0], &pipeContents, sizeof(OMX_U8)); 1239 1240 if(pipeContents==2){ 1241 eError = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StateIdle, NULL); 1242 if(eError != OMX_ErrorNone) { 1243 printf("Error from SendCommand-Idle(Stop) State function\n"); 1244 goto EXIT; 1245 } 1246 eError = WaitForState(pHandle, OMX_StateIdle); 1247 #ifdef OMX_GETTIME 1248 GT_END("Call to SendCommand <OMX_StateIdle>"); 1249 #endif 1250 if ( eError != OMX_ErrorNone ){ 1251 printf("Error:WaitForState has timed out %d", eError); 1252 goto EXIT; 1253 } 1254 audioinfo->dasfMode = 0; 1255 //pBuf->nFlags = 0; 1256 APP_DPRINT("%d [TEST APP] Shutting down ---------- \n",__LINE__); 1257 } 1258 } 1259 } /* While Loop Ending Here */ 1260 1261 APP_DPRINT("%d [TEST APP] The current state of the component = %d \n",__LINE__,gState); 1262 fclose(fOut); 1263 fclose(fIn); 1264 playcompleted = 0; 1265 1266 close(IpBuf_Pipe[0]); 1267 close(IpBuf_Pipe[1]); 1268 close(OpBuf_Pipe[0]); 1269 close(OpBuf_Pipe[1]); 1270 close(Event_Pipe[0]); 1271 close(Event_Pipe[1]); 1272 1273 if(tcID == 5 || tcID == 4) { 1274 sleep (1); 1275 } 1276 APP_DPRINT("%d [TEST APP] G711 Encoded = %d Frames \n",__LINE__,(nOutBuff)); 1277 } /*Test Case 4 & 5 Inner for loop ends here */ 1278 1279 1280 APP_DPRINT ("%d [TEST APP] Sending the OMX_CommandPortDisable Command\n",__LINE__); 1281 #ifdef OMX_GETTIME 1282 GT_START(); 1283 #endif 1284 eError = OMX_SendCommand(pHandle, OMX_CommandPortDisable, -1, NULL); 1285 if(eError != OMX_ErrorNone) { 1286 APP_DPRINT("%d:: Error from SendCommand OMX_CommandPortDisable\n",__LINE__); 1287 goto EXIT; 1288 } 1289 1290 APP_DPRINT ("%d [TEST APP] Sending the OMX_StateLoaded Command\n",__LINE__); 1291 eError = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateLoaded, NULL); 1292 if(eError != OMX_ErrorNone) { 1293 APP_DPRINT("%d:: Error from SendCommand-Idle State function\n",__LINE__); 1294 goto EXIT; 1295 } 1296 1297 /* free the Allocate and Use Buffers */ 1298 #ifndef USE_BUFFER 1299 APP_DPRINT("%d [TEST APP] Freeing the Allocate OR Use Buffers in TestApp\n",__LINE__); 1300 if(!audioinfo->dasfMode){ 1301 for(i=0; i < audioinfo->nIpBufs; i++) { 1302 APP_DPRINT("%d [TEST APP] About to free pInputBufferHeader[%d]\n",__LINE__, i); 1303 eError = OMX_FreeBuffer(pHandle, OMX_DirInput, pInputBufferHeader[i]); 1304 if((eError != OMX_ErrorNone)) { 1305 APP_DPRINT("%d:: Error in FreeBuffer function\n",__LINE__); 1306 goto EXIT; 1307 } 1308 } 1309 } 1310 for(i=0; i < audioinfo->nOpBufs; i++) { 1311 APP_DPRINT("%d [TEST APP] About to free pOutputBufferHeader[%d]\n",__LINE__, i); 1312 eError = OMX_FreeBuffer(pHandle, OMX_DirOutput, pOutputBufferHeader[i]); 1313 if((eError != OMX_ErrorNone)) { 1314 APP_DPRINT("%d Error in Free Buffer function\n",__LINE__); 1315 goto EXIT; 1316 } 1317 } 1318 #else 1319 /* free the App Allocated Buffers */ 1320 APP_DPRINT("%d [TEST APP] Freeing the App Allocated Buffers in TestApp\n",__LINE__); 1321 if(!audioinfo->dasfmode){ 1322 for(i=0; i < audioinfo->nIpBufs; i++) { 1323 APP_MEMPRINT("%d [TEST APP] [TESTAPPFREE] pInputBuffer[%d] = %p\n",__LINE__,i,pInputBuffer[i]); 1324 if(pInputBuffer[i] != NULL){ 1325 free(pInputBuffer[i]); 1326 pInputBuffer[i] = NULL; 1327 } 1328 } 1329 } 1330 for(i=0; i < audioinfo->nOpBufs; i++) { 1331 pOutputBuffer[i] = pOutputBuffer[i] - 128; 1332 APP_MEMPRINT("%d [TEST APP] [TESTAPPFREE] pOutputBuffer[%d] = %p\n",__LINE__,i, pOutputBuffer[i]); 1333 if(pOutputBuffer[i] != NULL){ 1334 free(pOutputBuffer[i]); 1335 pOutputBuffer[i] = NULL; 1336 } 1337 } 1338 #endif 1339 1340 1341 eError = WaitForState(pHandle, OMX_StateLoaded); 1342 #ifdef OMX_GETTIME 1343 GT_END("Call to SendCommand <OMX_CommandPortDisable, Buffer set then OMX_StateLoaded>"); 1344 #endif 1345 if(eError != OMX_ErrorNone) { 1346 APP_DPRINT("APP: Error: WaitForState reports an error %X\n", eError); 1347 goto EXIT; 1348 } 1349 1350 APP_DPRINT("%d [TEST APP] Freeing the Memory Allocated in TestApp\n",__LINE__); 1351 APP_MEMPRINT("%d [TEST APP] [TESTAPPFREE] %p\n",__LINE__,pG711Param); 1352 if(pG711Param != NULL){ 1353 free(pG711Param); 1354 pG711Param = NULL; 1355 } 1356 APP_MEMPRINT("%d [TEST APP] [TESTAPPFREE] %p\n",__LINE__,pCompPrivateStruct); 1357 if(pCompPrivateStruct != NULL){ 1358 free(pCompPrivateStruct); 1359 pCompPrivateStruct = NULL; 1360 } 1361 APP_MEMPRINT("%d [TEST APP] [TESTAPPFREE] %p\n",__LINE__,audioinfo); 1362 if(audioinfo != NULL){ 1363 free(audioinfo); 1364 audioinfo = NULL; 1365 } 1366 1367 APP_DPRINT("%d [TEST APP] Closing the Input and Output Pipes\n",__LINE__); 1368 eError = close (IpBuf_Pipe[0]); 1369 if (0 != eError && OMX_ErrorNone == eError) { 1370 eError = OMX_ErrorHardware; 1371 APP_DPRINT("%d Error while closing IpBuf_Pipe[0]\n",__LINE__); 1372 goto EXIT; 1373 } 1374 eError = close (IpBuf_Pipe[1]); 1375 if (0 != eError && OMX_ErrorNone == eError) { 1376 eError = OMX_ErrorHardware; 1377 APP_DPRINT("%d Error while closing IpBuf_Pipe[1]\n",__LINE__); 1378 goto EXIT; 1379 } 1380 eError = close (OpBuf_Pipe[0]); 1381 if (0 != eError && OMX_ErrorNone == eError) { 1382 eError = OMX_ErrorHardware; 1383 APP_DPRINT("%d Error while closing OpBuf_Pipe[0]\n",__LINE__); 1384 goto EXIT; 1385 } 1386 eError = close (OpBuf_Pipe[1]); 1387 if (0 != eError && OMX_ErrorNone == eError) { 1388 eError = OMX_ErrorHardware; 1389 APP_DPRINT("%d Error while closing OpBuf_Pipe[1]\n",__LINE__); 1390 goto EXIT; 1391 } 1392 eError = close (Event_Pipe[0]); 1393 if (0 != eError && OMX_ErrorNone == eError) { 1394 eError = OMX_ErrorHardware; 1395 APP_DPRINT("%d Error while closing Event_Pipe[0]\n",__LINE__); 1396 goto EXIT; 1397 } 1398 eError = close (Event_Pipe[1]); 1399 if (0 != eError && OMX_ErrorNone == eError) { 1400 eError = OMX_ErrorHardware; 1401 APP_DPRINT("%d Error while closing Event_Pipe[1]\n",__LINE__); 1402 goto EXIT; 1403 } 1404 /* exit audio manger */ 1405 #ifdef DSP_RENDERING_ON 1406 if((write(G711E_fdwrite, &cmd_data, sizeof(cmd_data)))<0){ 1407 printf("%d [TEST APP] - failure to send command to audio manager\n",__LINE__); 1408 } 1409 close(G711E_fdwrite); 1410 close(G711E_fdread); 1411 #endif 1412 1413 APP_DPRINT("%d [TEST APP] Free the Component handle\n",__LINE__); 1414 /* Unload the G711 Encoder Component */ 1415 eError = TIOMX_FreeHandle(pHandle); 1416 if((eError != OMX_ErrorNone)) { 1417 APP_DPRINT("%d Error in Free Handle function\n",__LINE__); 1418 goto EXIT; 1419 } 1420 APP_DPRINT("%d [TEST APP] Free Handle returned Successfully\n",__LINE__); 1421 1422 } /*Outer for loop ends here */ 1423 1424 pthread_mutex_destroy(&WaitForState_mutex); 1425 pthread_cond_destroy(&WaitForState_threshold); 1426 1427 #ifdef OMX_GETTIME 1428 GT_END("G711_Enc test <End>"); 1429 OMX_ListDestroy(pListHead); 1430 #endif 1431 1432 eError = TIOMX_Deinit(); 1433 if( (eError != OMX_ErrorNone)) { 1434 APP_DPRINT("%d:: APP: Error in Deinit Core function\n",__LINE__); 1435 goto EXIT; 1436 } 1437 1438 printf("*********************************************************************\n"); 1439 printf("NOTE: An output file %s has been created in file system\n",argv[2]); 1440 printf("*********************************************************************\n"); 1441 1442 EXIT: 1443 1444 return eError; 1445 } 1446 1447 OMX_ERRORTYPE send_input_buffer (OMX_HANDLETYPE pHandle, 1448 OMX_BUFFERHEADERTYPE* pBuffer, 1449 FILE *fIn) 1450 { 1451 OMX_ERRORTYPE error = OMX_ErrorNone; 1452 1453 pBuffer->nFilledLen = fread(pBuffer->pBuffer, 1, pBuffer->nAllocLen, fIn); 1454 1455 if(pBuffer->nFilledLen == 0) { 1456 APP_DPRINT("%d Sending Last Input Buffer from TestApp.............. \n",__LINE__); 1457 pBuffer->nFlags = OMX_BUFFERFLAG_EOS; 1458 }else{ 1459 pBuffer->nFlags = 0; 1460 } 1461 APP_DPRINT("%d [TEST APP] Input Buffer: Calling OMX_EmptyThisBuffer: %p\n",__LINE__,pBuffer); 1462 1463 pBuffer->nTimeStamp = rand()% 100; 1464 pBuffer->nTickCount = rand() % 70; 1465 1466 if(!playcompleted){ 1467 error = OMX_EmptyThisBuffer(pHandle, pBuffer); 1468 if( (error != OMX_ErrorNone)) { 1469 APP_DPRINT("%d [TEST APP] EmptyThisBuffer\n",__LINE__); 1470 goto EXIT; 1471 } 1472 } 1473 1474 1475 EXIT: 1476 return error; 1477 } 1478 1479