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 G729DecTest.c 26 * 27 * This File contains the G729 DECODER OMX tests 28 * 29 * @path $(OMAPSW_MPU)\linux\audio\src\openmax_il\g729_dec\tests 30 * 31 * @rev 0.5 32 */ 33/* ----------------------------------------------------------------------------- 34 *! 35 *! Revision History 36 *! =================================== 37 *! Date Author(s) Version Description 38 *! --------- ------------------- ------- --------------------------------- 39 *! 03-Jan-2007 A.Donjon 0.1 Code update for G729 DECODER 40 *! 19-Feb-2007 A.Donjon 0.2 Update for SN change for last frame 41 *! 06-Apr-2007 A.Donjon 0.3 USE_BUFFER 42 *! 08-Jun-2007 A.Donjon 0.4 Variable input buffer size 43 *! 04-Jul-2007 A.Donjon 0.5 Improved test app. 44 *! 45 *! 46 * ================================================================================= */ 47/**************************************************************** 48 * INCLUDE FILES 49 ****************************************************************/ 50 51/* ----- system and platform files ----------------------------*/ 52#include <unistd.h> 53#include <stdlib.h> 54#include <sys/ioctl.h> 55#include <sys/select.h> 56#include <string.h> 57#include <stdio.h> 58#include <fcntl.h> 59#include <errno.h> 60#include <linux/vt.h> 61#include <signal.h> 62#include <sys/stat.h> 63#include <pthread.h> 64#include <linux/soundcard.h> 65#include <time.h> 66 67/*-------program files ----------------------------------------*/ 68#include <OMX_Index.h> 69#include <OMX_Types.h> 70#include <TIDspOmx.h> 71#include <OMX_Core.h> 72#include <OMX_Audio.h> 73#include <G729DecTest.h> 74#include <OMX_G729Decoder.h> 75 76#ifdef OMX_GETTIME 77#include <OMX_Common_Utils.h> 78#include <OMX_GetTime.h> /*Headers for Performance & measuremet */ 79#endif 80 81/* ------compilation control switches -------------------------*/ 82#undef APP_DEBUG 83#undef APP_MEMCHECK 84#undef APP_INFO 85#undef USE_BUFFER 86 87/* ======================================================================= */ 88/** 89 * @def DASF Define a Value for DASF mode 90 */ 91/* ======================================================================= */ 92#define DASF 1 93/* ======================================================================= */ 94/** 95 * @def GAIN Define a GAIN value for Configure Audio 96 */ 97/* ======================================================================= */ 98#define GAIN 95 99/* ======================================================================= */ 100/** 101 * @def G729DEC_SAMPLING_FREQUENCY Sampling Frequency 102 */ 103/* ======================================================================= */ 104#define G729DEC_SAMPLING_FREQUENCY 8000 105/* ======================================================================= */ 106/** 107 * @def EXTRA_BUFFBYTES Num of Extra Bytes to be allocated 108 */ 109/* ======================================================================= */ 110#define EXTRA_BUFFBYTES (256) 111 112/* ======================================================================= */ 113/** 114 * @def CACHE_ALIGNMENT Buffer Cache Alignment 115 */ 116/* ======================================================================= */ 117#define CACHE_ALIGNMENT 128 118 119 120 121 122#define FIFO1 "/dev/fifo.1" 123#define FIFO2 "/dev/fifo.2" 124 125/**************************************************************** 126 * EXTERNAL REFERENCES NOTE : only use if not found in header file 127 ****************************************************************/ 128/*--------data declarations -----------------------------------*/ 129/*--------function prototypes ---------------------------------*/ 130 131/**************************************************************** 132 * PUBLIC DECLARATIONS Defined here, used elsewhere 133 ****************************************************************/ 134/*--------data declarations -----------------------------------*/ 135 136/*--------function prototypes ---------------------------------*/ 137 138/**************************************************************** 139 * PRIVATE DECLARATIONS Defined here, used only here 140 ****************************************************************/ 141/*--------data declarations -----------------------------------*/ 142 143#ifdef OMX_GETTIME 144OMX_ERRORTYPE eError = OMX_ErrorNone; 145int GT_FlagE = 0; /* Fill Buffer 1 = First Buffer, 0 = Not First Buffer */ 146int GT_FlagF = 0; /*Empty Buffer 1 = First Buffer, 0 = Not First Buffer */ 147static OMX_NODE* pListHead = NULL; 148#endif 149 150 151OMX_S16 inputPortDisabled = 0; 152OMX_S16 outputPortDisabled = 0; 153OMX_S8 InputCallbacksPending = 0; 154OMX_S8 OutputLastPending = 0; 155 156typedef enum COMPONENTS { 157 COMP_1, 158 COMP_2 159}COMPONENTS; 160 161OMX_STRING strG729Decoder = "OMX.TI.G729.decode"; 162int IpBuf_Pipe[2] = {0}; 163int OpBuf_Pipe[2] = {0}; 164fd_set rfds; 165OMX_S16 dasfMode = 0; 166OMX_S16 packetsPerBuffer = 0; 167OMX_S16 EOFevent = 0; 168OMX_BOOL bExitOnError = OMX_FALSE; 169int command = 0; 170 171#ifdef DSP_RENDERING_ON 172AM_COMMANDDATATYPE cmd_data; 173#endif 174 175/*--------function prototypes ---------------------------------*/ 176OMX_S16 maxint(OMX_S16 a, OMX_S16 b); 177OMX_ERRORTYPE StopComponent(OMX_HANDLETYPE *pHandle); 178OMX_ERRORTYPE PauseComponent(OMX_HANDLETYPE *pHandle); 179OMX_ERRORTYPE PlayComponent(OMX_HANDLETYPE *pHandle); 180OMX_S16 fill_data_fromFile (OMX_BUFFERHEADERTYPE *pBuf, FILE *fIn, OMX_HANDLETYPE pHandle); 181void ConfigureAudio(); 182OMX_ERRORTYPE send_input_buffer (OMX_HANDLETYPE pHandle, OMX_BUFFERHEADERTYPE* pBuffer, FILE *fIn); 183 184#ifdef USE_BUFFER 185OMX_ERRORTYPE FreeResources(OMX_AUDIO_PARAM_G729TYPE* pG729Param, 186 OMX_AUDIO_PARAM_PCMMODETYPE* pPcmParam, 187 OMX_PARAM_PORTDEFINITIONTYPE* pCompPrivateStruct, 188 OMX_AUDIO_CONFIG_MUTETYPE* pCompPrivateStructMute, 189 OMX_AUDIO_CONFIG_VOLUMETYPE* pCompPrivateStructVolume, 190 TI_OMX_DSP_DEFINITION* audioinfo, 191 OMX_U8* pInputBuffer[10], 192 OMX_U8* pOutputBuffer[10], 193 G729DEC_BufParamStruct* pInBufferParam[10], 194 OMX_HANDLETYPE* pHandle); 195#else 196OMX_ERRORTYPE FreeResources(OMX_AUDIO_PARAM_G729TYPE* pG729Param, 197 OMX_AUDIO_PARAM_PCMMODETYPE* pPcmParam, 198 OMX_PARAM_PORTDEFINITIONTYPE* pCompPrivateStruct, 199 OMX_AUDIO_CONFIG_MUTETYPE* pCompPrivateStructMute, 200 OMX_AUDIO_CONFIG_VOLUMETYPE* pCompPrivateStructVolume, 201 TI_OMX_DSP_DEFINITION* audioinfo, 202 OMX_BUFFERHEADERTYPE* pInputBufferHeader[10], 203 OMX_BUFFERHEADERTYPE* pOutputBufferHeader[10], 204 G729DEC_BufParamStruct* pInBufferParam[10], 205 OMX_HANDLETYPE* pHandle); 206#endif 207 208 209/*--------macros ----------------------------------------------*/ 210#ifdef APP_DEBUG 211#define APP_DPRINT(...) fprintf(stderr,__VA_ARGS__) 212#else 213#define APP_DPRINT(...) 214#endif 215 216#ifdef APP_INFO 217#define DPRINT(...) fprintf(stderr,__VA_ARGS__) 218#else 219#define DPRINT(...) 220#endif 221 222#ifdef APP_MEMCHECK 223#define APP_MEMPRINT(...) fprintf(stderr,__VA_ARGS__) 224#else 225#define APP_MEMPRINT(...) 226#endif 227 228 229/* safe routine to get the maximum of 2 integers */ 230OMX_S16 maxint(OMX_S16 a, OMX_S16 b) 231{ 232 return (a>b) ? a : b; 233} 234 235#define OMX_G729APP_INIT_STRUCT(_s_, _name_) \ 236 memset((_s_), 0x0, sizeof(_name_)); \ 237 238#define OMX_G729APP_MALLOC_STRUCT(_pStruct_, _sName_) \ 239 _pStruct_ = (_sName_*)malloc(sizeof(_sName_)); \ 240 if(_pStruct_ == NULL){ \ 241 printf("***********************************\n"); \ 242 printf("%d :: Malloc Failed\n",__LINE__); \ 243 printf("***********************************\n"); \ 244 error = OMX_ErrorInsufficientResources; \ 245 goto EXIT; \ 246 } \ 247 APP_MEMPRINT("%d :: ALLOCATING MEMORY = %p\n",__LINE__,_pStruct_); 248 249/* This method will wait for the component to get to the state 250 * specified by the DesiredState input. */ 251static OMX_ERRORTYPE WaitForState(OMX_HANDLETYPE* pHandle, 252 OMX_STATETYPE DesiredState) 253{ 254 OMX_STATETYPE CurState = OMX_StateInvalid; 255 OMX_ERRORTYPE eError = OMX_ErrorNone; 256 OMX_S16 nCnt = 0; 257 OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)pHandle; 258 eError = pComponent->GetState(pHandle, &CurState); 259 260 while((eError == OMX_ErrorNone) && (CurState != DesiredState) && (eError == OMX_ErrorNone) ) { 261 sleep(1); 262 if(nCnt++ == 10) { 263 APP_DPRINT( "Still Waiting, press CTL-C to continue\n"); 264 } 265 eError = pComponent->GetState(pHandle, &CurState); 266 267 } 268 return eError; 269} 270 271 272OMX_ERRORTYPE EventHandler( 273 OMX_HANDLETYPE hComponent, 274 OMX_PTR pAppData, 275 OMX_EVENTTYPE eEvent, 276 OMX_U32 nData1, 277 OMX_U32 nData2, 278 OMX_PTR pEventData) 279{ 280 281 OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)hComponent; 282 OMX_STATETYPE state = OMX_StateInvalid; 283 OMX_ERRORTYPE eError = OMX_ErrorNone; 284 285#ifdef APP_DEBUG 286 int iComp = *((int *)(pAppData)); 287#endif 288 289 eError = pComponent->GetState (hComponent, &state); 290 if(eError != OMX_ErrorNone) { 291 APP_DPRINT("%d :: App: Error returned from GetState\n",__LINE__); 292 } 293 switch (eEvent) { 294 case OMX_EventCmdComplete: 295 296 if(nData1 == OMX_CommandPortDisable){ 297 if (nData2 == OMX_DirInput) { 298 inputPortDisabled = 1; 299 } 300 if (nData2 == OMX_DirOutput) { 301 outputPortDisabled = 1; 302 } 303 } 304 else if(nData1 == OMX_CommandStateSet){ 305 306 307 } 308 break; 309 310 case OMX_EventError: 311 /* Error notification */ 312 if(nData1==OMX_ErrorOverflow){ 313 APP_DPRINT("EventHandler: WARNING: Overflow ERROR\n"); 314 /* Output buffer with sufficient allocated size must be sent to SN */ 315 } 316 if(nData1==OMX_ErrorStreamCorrupt){ 317 APP_DPRINT("EventHandler: ERROR: Data corrupt ERROR\n"); 318 /* Corrupted input buffer parameters, component must be reseted or stopped */ 319 } 320 break; 321 break; 322 case OMX_EventMax: 323 break; 324 case OMX_EventMark: 325 break; 326 327 default: 328 break; 329 } 330 return eError; 331} 332 333void FillBufferDone (OMX_HANDLETYPE hComponent, OMX_PTR ptr, OMX_BUFFERHEADERTYPE* pBufferO) 334{ 335 APP_DPRINT ("APP:::: OUTPUT BUFFER = %p && %p\n",pBufferO, pBufferO->pBuffer); 336 APP_DPRINT ("APP:::: pBuffer->nFilledLen = %d\n",pBufferO->nFilledLen); 337 write(OpBuf_Pipe[1], &pBufferO, sizeof(pBufferO)); 338 339#ifdef OMX_GETTIME 340 if (GT_FlagF == 1 ) /* First Buffer Reply*/ /* 1 = First Buffer, 0 = Not First Buffer */ 341 { 342 GT_END("Call to FillBufferDone <First: FillBufferDone>"); 343 GT_FlagF = 0 ; /* 1 = First Buffer, 0 = Not First Buffer */ 344 } 345#endif 346 347} 348 349 350void EmptyBufferDone(OMX_HANDLETYPE hComponent, OMX_PTR ptr, OMX_BUFFERHEADERTYPE* pBufferI) 351{ 352 OMX_S16 ret = 0; 353 APP_DPRINT ("APP:::: INPUT BUFFER = %p && %p\n",pBufferI, pBufferI->pBuffer); 354 if (command == 0){ 355 APP_DPRINT("output: pBuffer->nTimeStamp = %d\n", (int)pBufferI->nTimeStamp); 356 APP_DPRINT("output: pBuffer->nTickCount = %ld\n", pBufferI->nTickCount); 357 } 358 ret = write(IpBuf_Pipe[1], &pBufferI, sizeof(pBufferI)); 359 360#ifdef OMX_GETTIME 361 if (GT_FlagE == 1 ) /* First Buffer Reply*/ /* 1 = First Buffer, 0 = Not First Buffer */ 362 { 363 GT_END("Call to EmptyBufferDone <First: EmptyBufferDone>"); 364 GT_FlagE = 0; /* 1 = First Buffer, 0 = Not First Buffer */ 365 } 366#endif 367} 368 369 370 371OMX_S16 SendInputBuffer = 0; 372OMX_S16 numInputBuffers = 0; 373OMX_S16 numOutputBuffers = 0; 374FILE *fp; 375 376int main(int argc, char* argv[]) 377{ 378 OMX_CALLBACKTYPE G729CaBa = {(void *)EventHandler, 379 (void*)EmptyBufferDone, 380 (void*)FillBufferDone}; 381 OMX_HANDLETYPE pHandle; 382 OMX_ERRORTYPE error = OMX_ErrorNone; 383 OMX_U32 AppData = 100; 384 OMX_PARAM_PORTDEFINITIONTYPE* pCompPrivateStruct = NULL; 385 OMX_AUDIO_PARAM_G729TYPE *pG729Param = NULL; 386 OMX_AUDIO_PARAM_PCMMODETYPE *pPcmParam = NULL; 387 OMX_COMPONENTTYPE *pComponent = NULL; 388 OMX_STATETYPE state = OMX_StateInvalid; 389 OMX_BUFFERHEADERTYPE* pInputBufferHeader[10] = {NULL}; 390 OMX_BUFFERHEADERTYPE* pOutputBufferHeader[10] = {NULL}; 391 TI_OMX_DSP_DEFINITION *audioinfo = NULL; 392 G729DEC_BufParamStruct* pInBufferParam[10] = {NULL}; 393 394#ifdef USE_BUFFER 395 OMX_U8* pInputBuffer[10] = {NULL}; 396 OMX_U8* pOutputBuffer[10]= {NULL}; 397#endif 398 399 struct timeval tv; 400 OMX_S16 retval = 0, i = 0, j = 0,k = 0; 401 OMX_S16 frmCount = 0; 402 OMX_S16 OutBufCount = 0; 403 OMX_S16 InBufCount = 0; 404 OMX_S16 testcnt = 1; 405 OMX_S16 testcnt1 = 1; 406 OMX_BUFFERHEADERTYPE* pBuffer = NULL; 407 OMX_BUFFERHEADERTYPE* pBuf = NULL; 408 OMX_INDEXTYPE index = 0; 409 TI_OMX_DATAPATH dataPath; 410 int g729decfdwrite = 0; 411 int g729decfdread = 0; 412 OMX_AUDIO_CONFIG_MUTETYPE* pCompPrivateStructMute = NULL; 413 OMX_AUDIO_CONFIG_VOLUMETYPE* pCompPrivateStructVolume = NULL; 414 415#ifdef MTRACE 416 mtrace(); 417#endif 418 419 bExitOnError = OMX_FALSE; 420 OMX_G729APP_MALLOC_STRUCT(audioinfo, TI_OMX_DSP_DEFINITION); 421 OMX_G729APP_INIT_STRUCT(audioinfo, TI_OMX_DSP_DEFINITION); 422 APP_DPRINT("------------------------------------------------------\n"); 423 APP_DPRINT("This is Main Thread In G729 DECODER Test Application:\n"); 424 APP_DPRINT("Test Core 1.5 - " __DATE__ ":" __TIME__ "\n"); 425 APP_DPRINT("------------------------------------------------------\n"); 426 427#ifdef OMX_GETTIME 428 GTeError = OMX_ListCreate(&pListHead); 429 printf("eError = %d\n",GTeError); 430 GT_START(); 431#endif 432 433#ifdef DSP_RENDERING_ON 434 if((g729decfdwrite=open(FIFO1,O_WRONLY))<0) { 435 printf("[G729TEST] - failure to open WRITE pipe\n"); 436 } 437 else { 438 printf("[G729TEST] - opened WRITE pipe\n"); 439 } 440 441 if((g729decfdread=open(FIFO2,O_RDONLY))<0) { 442 printf("[G729TEST] - failure to open READ pipe\n"); 443 bExitOnError = OMX_TRUE; 444 goto EXIT; 445 } 446 else { 447 printf("[G729TEST] - opened READ pipe\n"); 448 } 449#endif 450 451 /* check the input parameters */ 452 if(argc != 8) { 453 printf( "Usage: testApp infile outfile TestCaseNo DASFmode nbinbuf nboutbuf nbPacketsPerBuffer\n"); 454 printf(" DASFmode: FM or DM for File Mode or DASF Mode\n"); 455 bExitOnError = OMX_TRUE; 456 goto EXIT; 457 } 458 459 numInputBuffers = atoi(argv[5]); 460 numOutputBuffers = atoi(argv[6]); 461 462 /* validate number of buffers input from command */ 463 if(numInputBuffers < 1 || numInputBuffers > 4) 464 { 465 printf("Please use between at least 1 but no more than 4 input buffers\n"); 466 bExitOnError = OMX_TRUE; 467 goto EXIT; 468 } 469 if(numOutputBuffers < 1 || numOutputBuffers > 4) 470 { 471 printf("Please use between at least 1 but no more than 4 output buffers\n"); 472 bExitOnError = OMX_TRUE; 473 goto EXIT; 474 } 475 APP_DPRINT( "Nb input buffers: %d, Nb output buffers: %d\n", numInputBuffers, numOutputBuffers); 476 packetsPerBuffer = atoi(argv[7]); 477 if((packetsPerBuffer>0)&&(packetsPerBuffer<7)){ 478 APP_DPRINT( "Nb packets per buffer: %d\n", packetsPerBuffer); 479 } 480 else{ 481 printf("Number of packets per buffer should be between 1 and 6\n"); 482 bExitOnError = OMX_TRUE; 483 goto EXIT; 484 } 485 486 /* check to see that the input file exists */ 487 struct stat sb = {0}; 488 OMX_S16 status = stat(argv[1], &sb); 489 if( status != 0 ) { 490 APP_DPRINT( "Cannot find file %s. (%u)\n", argv[1], errno); 491 bExitOnError = OMX_TRUE; 492 goto EXIT; 493 } 494 495 /* Open the file of data to be decoded */ 496 FILE* fIn = fopen(argv[1], "r"); 497 fp =fopen(argv[1], "r"); 498 if( fIn == NULL ) { 499 APP_DPRINT( "Error: failed to open the file %s for readonly\access\n", argv[1]); 500 bExitOnError = OMX_TRUE; 501 goto EXIT; 502 } 503 504 FILE* fOut = NULL; 505 /* Open the output file only in no DASF mode*/ 506 if(!(strcmp(argv[4],"FM"))){ 507 fOut = fopen(argv[2], "w"); 508 APP_DPRINT( "NO DASF MODE, created output file \n"); 509 if( fOut == NULL ) { 510 APP_DPRINT( "Error: failed to create the output file %s\n", argv[2]); 511 bExitOnError = OMX_TRUE; 512 goto EXIT; 513 } 514 } 515 516 /* Create a pipe used to queue data from the callback. */ 517 retval = pipe(IpBuf_Pipe); 518 if( retval != 0) { 519 APP_DPRINT( "Error:Fill Data Pipe failed to open\n"); 520 bExitOnError = OMX_TRUE; 521 goto EXIT; 522 } 523 524 retval = pipe(OpBuf_Pipe); 525 if( retval != 0) { 526 APP_DPRINT( "Error:Empty Data Pipe failed to open\n"); 527 bExitOnError = OMX_TRUE; 528 goto EXIT; 529 } 530 531 /* save off the "max" of the handles for the selct statement */ 532 OMX_S16 fdmax = maxint(IpBuf_Pipe[0], OpBuf_Pipe[0]); 533 534 APP_DPRINT("%d :: G729Test\n",__LINE__); 535 error = TIOMX_Init(); 536 APP_DPRINT("%d :: G729Test\n",__LINE__); 537 if(error != OMX_ErrorNone) { 538 APP_DPRINT("%d :: Error returned by OMX_Init()\n",__LINE__); 539 bExitOnError = OMX_TRUE; 540 goto EXIT; 541 } 542 543 /* Test case number */ 544 command = atoi(argv[3]); 545 APP_DPRINT("%d :: G729Test\n",__LINE__); 546 switch (command ) { 547 case 0: 548 printf ("-------------------------------------\n"); 549 printf ("Testing Time stamp and Tick count \n"); 550 printf ("-------------------------------------\n"); 551 break; 552 case 1: 553 printf ("-------------------------------------\n"); 554 printf ("Testing Simple PLAY till EOF \n"); 555 printf ("-------------------------------------\n"); 556 break; 557 case 2: 558 printf ("-------------------------------------\n"); 559 printf ("Testing Stop and Play \n"); 560 printf ("-------------------------------------\n"); 561 break; 562 case 3: 563 printf ("-------------------------------------\n"); 564 printf ("Testing PAUSE & RESUME Command\n"); 565 printf ("-------------------------------------\n"); 566 break; 567 case 4: 568 printf ("---------------------------------------------\n"); 569 printf ("Testing STOP Command by Stopping In-Between\n"); 570 printf ("---------------------------------------------\n"); 571 break; 572 case 5: 573 printf ("-------------------------------------------------\n"); 574 printf ("Testing Repeated PLAY without Deleting Component\n"); 575 printf ("-------------------------------------------------\n"); 576 testcnt = 15; 577 break; 578 case 6: 579 printf ("------------------------------------------------\n"); 580 printf ("Testing Repeated PLAY with Deleting Component\n"); 581 printf ("------------------------------------------------\n"); 582 testcnt1 = 15; 583 break; 584 case 7: 585 printf ("------------------------------------------------------------\n"); 586 printf ("Testing Mute/Unmute for Playback Stream\n"); 587 printf ("------------------------------------------------------------\n"); 588 break; 589 case 8: 590 printf ("------------------------------------------------------------\n"); 591 printf ("Testing Set Volume for Playback Stream\n"); 592 printf ("------------------------------------------------------------\n"); 593 break; 594 default: 595 printf("------------------------------------------------------------\n"); 596 printf("Wrong test case number. Valid test number from 1 to 8\n"); 597 bExitOnError = OMX_TRUE; 598 goto EXIT; 599 } 600 601 if(!(strcmp(argv[4],"FM"))) { 602 audioinfo->dasfMode = 0; 603 dasfMode = 0; 604 printf("NON DASF MODE\n"); 605 } 606 else if(!(strcmp(argv[4],"DM"))){ 607 audioinfo->dasfMode = 1; 608 dasfMode = 1; 609 printf("DASF MODE\n"); 610 611#if STATE_TRANSITION_STATE 612 ConfigureAudio(); 613#endif 614 615 } 616 else { 617 printf("Enter proper DASF mode: \n"); 618 printf("Should be one of these modes: FM or DM for File Mode or DASF Mode\n"); 619 bExitOnError = OMX_TRUE; 620 goto EXIT; 621 } 622 623 624 APP_DPRINT("%d :: G729Test\n",__LINE__); 625 for(j = 0; j < testcnt1; j++) { 626 if(j >= 1) { 627 printf ("Decoding the file for %d Time\n",j+1); 628 close(IpBuf_Pipe[0]); 629 close(IpBuf_Pipe[1]); 630 close(OpBuf_Pipe[0]); 631 close(OpBuf_Pipe[1]); 632 633 634 /* Create a pipe used to queue data from the callback. */ 635 retval = pipe( IpBuf_Pipe); 636 if( retval != 0) { 637 APP_DPRINT( "Error:Fill Data Pipe failed to open\n"); 638 bExitOnError = OMX_TRUE; 639 goto EXIT; 640 } 641 642 retval = pipe( OpBuf_Pipe); 643 if( retval != 0) { 644 APP_DPRINT( "Error:Empty Data Pipe failed to open\n"); 645 bExitOnError = OMX_TRUE; 646 goto EXIT; 647 } 648 649 /* Open the input file to be decoded */ 650 fIn = fopen(argv[1], "r"); 651 fp= fopen(argv[1], "r"); 652 if( fIn == NULL ) { 653 fprintf(stderr, "Error: failed to open the file %s for readonly\ 654 access\n", argv[1]); 655 bExitOnError = OMX_TRUE; 656 goto EXIT; 657 } 658 659 /* Open the output file only in non DASF mode */ 660 if(audioinfo->dasfMode == 0){ 661 fOut = fopen(argv[2], "w"); 662 if( fOut == NULL ) { 663 fprintf(stderr, "Error: failed to create the output file \n"); 664 bExitOnError = OMX_TRUE; 665 goto EXIT; 666 } 667 error = TIOMX_Init(); 668 } 669 670 } 671 672 /* Load the G729 Decoder Component */ 673 APP_DPRINT("%d :: G729Test\n",__LINE__); 674 675#ifdef OMX_GETTIME 676 GT_START(); 677 error = OMX_GetHandle(&pHandle, strG729Decoder, &AppData, &G729CaBa); 678 GT_END("Call to GetHandle"); 679#else 680 error = TIOMX_GetHandle(&pHandle, strG729Decoder, &AppData, &G729CaBa); 681#endif 682 683 APP_DPRINT("%d :: G729Test\n",__LINE__); 684 if((error != OMX_ErrorNone) || (pHandle == NULL)) { 685 APP_DPRINT ("Error in Get Handle function\n"); 686 bExitOnError = OMX_TRUE; 687 goto EXIT; 688 } 689 690 APP_DPRINT("%d :: G729Test\n",__LINE__); 691 OMX_G729APP_MALLOC_STRUCT(pCompPrivateStruct, OMX_PARAM_PORTDEFINITIONTYPE); 692 OMX_G729APP_INIT_STRUCT(pCompPrivateStruct, OMX_PARAM_PORTDEFINITIONTYPE); 693 /* set playback stream mute/unmute */ 694 OMX_G729APP_MALLOC_STRUCT(pCompPrivateStructMute, OMX_AUDIO_CONFIG_MUTETYPE); 695 OMX_G729APP_INIT_STRUCT(pCompPrivateStructMute, OMX_AUDIO_CONFIG_MUTETYPE); 696 OMX_G729APP_MALLOC_STRUCT(pCompPrivateStructVolume, OMX_AUDIO_CONFIG_VOLUMETYPE); 697 OMX_G729APP_INIT_STRUCT(pCompPrivateStructVolume, OMX_AUDIO_CONFIG_VOLUMETYPE); 698 699 700 701 pCompPrivateStruct->nSize = sizeof (OMX_PARAM_PORTDEFINITIONTYPE); 702 pCompPrivateStruct->nVersion.s.nVersionMajor = 0x1; 703 pCompPrivateStruct->nVersion.s.nVersionMinor = 0x2; 704 APP_DPRINT("%d :: G729Test\n",__LINE__); 705 706 /* Send input port config */ 707 pCompPrivateStruct->eDir = OMX_DirInput; 708 pCompPrivateStruct->nPortIndex = OMX_DirInput; 709 pCompPrivateStruct->nBufferCountActual = numInputBuffers; 710 pCompPrivateStruct->nBufferSize = INPUT_G729DEC_BUFFER_SIZE*packetsPerBuffer; 711 pCompPrivateStruct->format.audio.eEncoding = OMX_AUDIO_CodingG729; 712 pCompPrivateStruct->bEnabled = 1; 713 pCompPrivateStruct->bPopulated = 0; 714#ifdef OMX_GETTIME 715 GT_START(); 716 error = OMX_SetParameter (pHandle,OMX_IndexParamPortDefinition, 717 pCompPrivateStruct); 718 GT_END("Set Parameter Test-SetParameter"); 719#else 720 error = OMX_SetParameter (pHandle,OMX_IndexParamPortDefinition, 721 pCompPrivateStruct); 722#endif 723 if (error != OMX_ErrorNone) { 724 error = OMX_ErrorBadParameter; 725 printf ("%d:: OMX_ErrorBadParameter\n",__LINE__); 726 bExitOnError = OMX_TRUE; 727 goto EXIT; 728 } 729 730 /* Send output port config */ 731 pCompPrivateStruct->nPortIndex = OMX_DirOutput; 732 pCompPrivateStruct->eDir = OMX_DirOutput; 733 pCompPrivateStruct->format.audio.eEncoding = OMX_AUDIO_CodingPCM; 734 pCompPrivateStruct->nBufferCountActual = numOutputBuffers; 735 pCompPrivateStruct->nBufferSize = (OUTPUT_G729DEC_BUFFER_SIZE)*packetsPerBuffer; 736 if(audioinfo->dasfMode == 1) { 737 pCompPrivateStruct->nBufferCountActual = 0; 738 } 739 740#ifdef OMX_GETTIME 741 GT_START(); 742 error = OMX_SetParameter (pHandle,OMX_IndexParamPortDefinition, 743 pCompPrivateStruct); 744 GT_END("Set Parameter Test-SetParameter"); 745#else 746 error = OMX_SetParameter (pHandle,OMX_IndexParamPortDefinition, 747 pCompPrivateStruct); 748#endif 749 750 if (error != OMX_ErrorNone) { 751 error = OMX_ErrorBadParameter; 752 printf ("%d:: OMX_ErrorBadParameter\n",__LINE__); 753 bExitOnError = OMX_TRUE; 754 goto EXIT; 755 } 756 757 /* default setting for Mute/Unmute */ 758 pCompPrivateStructMute->nSize = sizeof (OMX_AUDIO_CONFIG_MUTETYPE); 759 pCompPrivateStructMute->nVersion.s.nVersionMajor = 0x1; 760 pCompPrivateStructMute->nVersion.s.nVersionMinor = 0x1; 761 pCompPrivateStructMute->nPortIndex = OMX_DirInput; 762 pCompPrivateStructMute->bMute = OMX_FALSE; 763 764 /* default setting for volume */ 765 pCompPrivateStructVolume->nSize = sizeof(OMX_AUDIO_CONFIG_VOLUMETYPE); 766 pCompPrivateStructVolume->nVersion.s.nVersionMajor = 0x1; 767 pCompPrivateStructVolume->nVersion.s.nVersionMinor = 0x1; 768 pCompPrivateStructVolume->nPortIndex = OMX_DirInput; 769 pCompPrivateStructVolume->bLinear = OMX_FALSE; 770 pCompPrivateStructVolume->sVolume.nValue = 0x4000; /*actual volume */ 771 pCompPrivateStructVolume->sVolume.nMin = 0; /* min volume */ 772 pCompPrivateStructVolume->sVolume.nMax = 100; /* max volume */ 773 774#ifndef USE_BUFFER 775 776 for (i=0; i < numInputBuffers; i++) { 777 OMX_G729APP_MALLOC_STRUCT(pInBufferParam[i], G729DEC_BufParamStruct); 778 OMX_G729APP_INIT_STRUCT(pInBufferParam[i], G729DEC_BufParamStruct); 779 /* allocate input buffer */ 780 APP_DPRINT("%d :: About to call OMX_AllocateBuffer\n",__LINE__); 781 error = OMX_AllocateBuffer(pHandle, 782 &pInputBufferHeader[i], 0, 783 pInBufferParam[i], 784 INPUT_G729DEC_BUFFER_SIZE*packetsPerBuffer); 785 APP_DPRINT("%d :: called OMX_AllocateBuffer\n",__LINE__); 786 if(error != OMX_ErrorNone) { 787 APP_DPRINT("%d :: Error returned by OMX_AllocateBuffer()\n",__LINE__); 788 bExitOnError = OMX_TRUE; 789 goto EXIT; 790 } 791 } 792 for (i=0; i < numOutputBuffers; i++) { 793 /* allocate output buffer */ 794 APP_DPRINT("%d :: About to call OMX_AllocateBuffer\n",__LINE__); 795 error = OMX_AllocateBuffer(pHandle,&pOutputBufferHeader[i],1,NULL,(OUTPUT_G729DEC_BUFFER_SIZE)*packetsPerBuffer); 796 APP_DPRINT("%d :: called OMX_AllocateBuffer\n",__LINE__); 797 if(error != OMX_ErrorNone) { 798 APP_DPRINT("%d :: Error returned by OMX_AllocateBuffer()\n",__LINE__); 799 bExitOnError = OMX_TRUE; 800 goto EXIT; 801 } 802 } 803 804#else 805 806 APP_DPRINT("%d :: About to call OMX_UseBuffer\n",__LINE__); 807 /* numInputBuffers validated above to resolve Klockworks error */ 808 for (i=0; i < numInputBuffers; i++){ 809 OMX_G729APP_MALLOC_STRUCT(pInBufferParam[i], G729DEC_BufParamStruct); 810 OMX_G729APP_INIT_STRUCT(pInBufferParam[i], G729DEC_BufParamStruct); 811 pInputBuffer[i] = (OMX_U8*)malloc((INPUT_G729DEC_BUFFER_SIZE*packetsPerBuffer) + EXTRA_BUFFBYTES); 812 memset(pInputBuffer[i] , 0x0, (INPUT_G729DEC_BUFFER_SIZE*packetsPerBuffer) + EXTRA_BUFFBYTES); 813 APP_MEMPRINT("%d:::[TESTAPPALLOC] %p\n",__LINE__,pInputBuffer[i]); 814 pInputBuffer[i] = pInputBuffer[i] + CACHE_ALIGNMENT; 815 816 /* allocate input buffer */ 817 APP_DPRINT("%d :: About to call OMX_UseBuffer\n",__LINE__); 818 error = OMX_UseBuffer(pHandle,&pInputBufferHeader[i],0,pInBufferParam[i],INPUT_G729DEC_BUFFER_SIZE*packetsPerBuffer,pInputBuffer[i]); 819 APP_DPRINT("%d :: called OMX_UseBuffer\n",__LINE__); 820 if(error != OMX_ErrorNone){ 821 APP_DPRINT("%d :: Error returned by OMX_UseBuffer()\n",__LINE__); 822 bExitOnError = OMX_TRUE; 823 goto EXIT; 824 } 825 } 826 /* numInputBuffers validated above to resolve Klockworks error */ 827 for ( i = 0 ; i < numOutputBuffers ; i++ ){ 828 pOutputBuffer[i] = (OMX_U8*)malloc(((OUTPUT_G729DEC_BUFFER_SIZE)*packetsPerBuffer)+EXTRA_BUFFBYTES); 829 memset(pOutputBuffer[i] , 0x0, (OUTPUT_G729DEC_BUFFER_SIZE*packetsPerBuffer) + EXTRA_BUFFBYTES); 830 APP_MEMPRINT("%d:::[TESTAPPALLOC] %p\n",__LINE__,pOutputBuffer); 831 pOutputBuffer[i] = pOutputBuffer[i] + CACHE_ALIGNMENT; 832 /* allocate output buffer */ 833 APP_DPRINT("%d :: About to call OMX_UseBuffer\n",__LINE__); 834 error = OMX_UseBuffer(pHandle,&pOutputBufferHeader[i],1,NULL,(OUTPUT_G729DEC_BUFFER_SIZE)*packetsPerBuffer,pOutputBuffer[i]); 835 APP_DPRINT("%d :: called OMX_UseBuffer\n",__LINE__); 836 if(error != OMX_ErrorNone){ 837 APP_DPRINT("%d :: Error returned by OMX_UseBuffer()\n",__LINE__); 838 bExitOnError = OMX_TRUE; 839 goto EXIT; 840 } 841 } 842#endif 843 844 OMX_G729APP_MALLOC_STRUCT(pG729Param, OMX_AUDIO_PARAM_G729TYPE); 845 OMX_G729APP_INIT_STRUCT(pG729Param, OMX_AUDIO_PARAM_G729TYPE); 846 pG729Param->nSize = sizeof (OMX_AUDIO_PARAM_G729TYPE); 847 pG729Param->nVersion.s.nVersionMajor = 0xF1; 848 pG729Param->nVersion.s.nVersionMinor = 0xF2; 849 pG729Param->nPortIndex = OMX_DirInput; 850 pG729Param->nChannels = 1; 851 pG729Param->eBitType = OMX_AUDIO_G729AB; 852 853#ifdef OMX_GETTIME 854 GT_START(); 855 error = OMX_SetParameter (pHandle,OMX_IndexParamAudioG729, 856 pG729Param); 857 GT_END("Set Parameter Test-SetParameter"); 858#else 859 error = OMX_SetParameter (pHandle,OMX_IndexParamAudioG729, 860 pG729Param); 861#endif 862 863 if (error != OMX_ErrorNone) { 864 error = OMX_ErrorBadParameter; 865 printf ("%d:: OMX_ErrorBadParameter\n",__LINE__); 866 bExitOnError = OMX_TRUE; 867 goto EXIT; 868 } 869 OMX_G729APP_MALLOC_STRUCT(pPcmParam, OMX_AUDIO_PARAM_PCMMODETYPE); 870 OMX_G729APP_INIT_STRUCT(pPcmParam, OMX_AUDIO_PARAM_PCMMODETYPE); 871 pPcmParam->nPortIndex = OMX_DirOutput; 872 pPcmParam->nChannels = 1; 873#ifdef OMX_GETTIME 874 GT_START(); 875 error = OMX_SetParameter (pHandle,OMX_IndexParamAudioPcm, 876 pPcmParam); 877 GT_END("Set Parameter Test-SetParameter"); 878#else 879 error = OMX_SetParameter (pHandle,OMX_IndexParamAudioPcm, 880 pPcmParam); 881#endif 882 if (error != OMX_ErrorNone) { 883 error = OMX_ErrorBadParameter; 884 printf ("%d:: OMX_ErrorBadParameter\n",__LINE__); 885 bExitOnError = OMX_TRUE; 886 goto EXIT; 887 } 888 889 /* get TeeDN or ACDN mode */ 890 audioinfo->acousticMode = OMX_FALSE; 891 892 if (dasfMode) { 893#ifdef RTM_PATH 894 dataPath = DATAPATH_APPLICATION_RTMIXER; 895#endif 896 897#ifdef ETEEDN_PATH 898 dataPath = DATAPATH_APPLICATION; 899#endif 900 } 901 902 error = OMX_GetExtensionIndex(pHandle, "OMX.TI.index.config.g729headerinfo",&index); 903 if (error != OMX_ErrorNone) { 904 printf("Error getting extension index\n"); 905 bExitOnError = OMX_TRUE; 906 goto EXIT; 907 } 908 909#ifdef DSP_RENDERING_ON 910 cmd_data.hComponent = pHandle; 911 cmd_data.AM_Cmd = AM_CommandIsOutputStreamAvailable; 912 cmd_data.param1 = 0; 913 if((write(g729decfdwrite, &cmd_data, sizeof(cmd_data)))<0) { 914 printf("%d ::OMX_G729Decoder.c ::[G729 Dec Component] - send command to audio manager\n", __LINE__); 915 } 916 if((read(g729decfdread, &cmd_data, sizeof(cmd_data)))<0) { 917 printf("%d ::OMX_G729Decoder.c ::[G729 Dec Component] - failure to get data from the audio manager\n", __LINE__); 918 bExitOnError = OMX_TRUE; 919 goto EXIT; 920 } 921 audioinfo->streamId = cmd_data.streamID; 922#endif 923 924 error = OMX_SetConfig (pHandle, index, audioinfo); 925 if(error != OMX_ErrorNone) { 926 error = OMX_ErrorBadParameter; 927 APP_DPRINT("%d :: Error from OMX_SetConfig() function\n",__LINE__); 928 bExitOnError = OMX_TRUE; 929 goto EXIT; 930 /* TODO: should be sure resources are cleaned up at any of the goto EXIT statements */ 931 } 932 933 error = OMX_GetExtensionIndex(pHandle, "OMX.TI.index.config.g729.datapath",&index); 934 if (error != OMX_ErrorNone) { 935 printf("Error getting extension index\n"); 936 bExitOnError = OMX_TRUE; 937 goto EXIT; 938 } 939 940 941 error = OMX_SetConfig (pHandle, index, &dataPath); 942 if(error != OMX_ErrorNone) { 943 error = OMX_ErrorBadParameter; 944 APP_DPRINT("%d :: G729DecTest.c :: Error from OMX_SetConfig() function\n",__LINE__); 945 bExitOnError = OMX_TRUE; 946 goto EXIT; 947 } 948 949#ifdef OMX_GETTIME 950 GT_START(); 951#endif 952 953 error = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StateIdle, NULL); 954 if(error != OMX_ErrorNone) { 955 APP_DPRINT ("Error from SendCommand-Idle(Init) State function\n"); 956 bExitOnError = OMX_TRUE; 957 goto EXIT; 958 } 959 /* Wait for startup to complete */ 960 error = WaitForState(pHandle, OMX_StateIdle); 961#ifdef OMX_GETTIME 962 GT_END("Call to SendCommand <OMX_StateIdle>"); 963#endif 964 if(error != OMX_ErrorNone) { 965 APP_DPRINT( "Error: hG729Decoder->WaitForState reports an error %X\n", error); 966 bExitOnError = OMX_TRUE; 967 goto EXIT; 968 } 969 for(i = 0; i < testcnt; i++) { /* PROCESS LOOP */ 970 if(i > 0) { 971 printf ("Decoding the file for %d Time\n",i+1); 972 close(IpBuf_Pipe[0]); 973 close(IpBuf_Pipe[1]); 974 close(OpBuf_Pipe[0]); 975 close(OpBuf_Pipe[1]); 976 977 /* Create a pipe used to queue data from the callback. */ 978 retval = pipe(IpBuf_Pipe); 979 if( retval != 0) { 980 APP_DPRINT( "Error:Fill Data Pipe failed to open\n"); 981 bExitOnError = OMX_TRUE; 982 goto EXIT; 983 } 984 985 retval = pipe(OpBuf_Pipe); 986 if( retval != 0) { 987 APP_DPRINT( "Error:Empty Data Pipe failed to open\n"); 988 bExitOnError = OMX_TRUE; 989 goto EXIT; 990 } 991 992 /* Open the input file for decoding */ 993 fIn = fopen(argv[1], "r"); 994 fp= fopen(argv[1], "r"); 995 if(fIn == NULL) { 996 fprintf(stderr, "Error: failed to open the file %s for readonly access\n", argv[1]); 997 bExitOnError = OMX_TRUE; 998 goto EXIT; 999 } 1000 1001 /* Open the output file only in non DASF mode */ 1002 if(audioinfo->dasfMode == 0){ 1003 fOut = fopen(argv[2], "w"); 1004 if(fOut == NULL) { 1005 fprintf(stderr, "Error: failed to create the output file \n"); 1006 bExitOnError = OMX_TRUE; 1007 goto EXIT; 1008 } 1009 } 1010 } 1011 printf ("Basic Function:: Sending OMX_StateExecuting Command\n"); 1012#ifdef OMX_GETTIME 1013 GT_START(); 1014#endif 1015 error = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StateExecuting, NULL); 1016 if(error != OMX_ErrorNone) { 1017 APP_DPRINT ("Error from SendCommand-Executing State function\n"); 1018 bExitOnError = OMX_TRUE; 1019 goto EXIT; 1020 } 1021 pComponent = (OMX_COMPONENTTYPE *)pHandle; 1022 error = pComponent->GetState(pHandle, &state); 1023 error = WaitForState(pHandle, OMX_StateExecuting); 1024#ifdef OMX_GETTIME 1025 GT_END("Call to SendCommand <OMX_StateExecuting>"); 1026#endif 1027 if(error != OMX_ErrorNone) { 1028 APP_DPRINT( "Error: hG729Decoder->WaitForState reports an error %X\n", error); 1029 bExitOnError = OMX_TRUE; 1030 goto EXIT; 1031 } 1032 1033 InputCallbacksPending = 0; 1034 for (k=0; k < numInputBuffers; k++) { 1035 pInputBufferHeader[k]->nFlags = 0; 1036 1037#ifdef OMX_GETTIME 1038 if (k==0) 1039 { 1040 GT_FlagE=1; /* 1 = First Buffer, 0 = Not First Buffer */ 1041 GT_START(); /* Empty Bufffer */ 1042 } 1043#endif 1044 1045 error = send_input_buffer (pHandle, pInputBufferHeader[k], fIn); 1046 } 1047 1048 if (audioinfo->dasfMode == 0) { 1049 for (k=0; k < numOutputBuffers; k++) { 1050 pOutputBufferHeader[k]->nFlags = 0; 1051 1052#ifdef OMX_GETTIME 1053 if (k==0) 1054 { 1055 GT_FlagF=1; /* 1 = First Buffer, 0 = Not First Buffer */ 1056 GT_START(); /* Fill Buffer */ 1057 } 1058#endif 1059 1060 pComponent->FillThisBuffer(pHandle, pOutputBufferHeader[k]); 1061 } 1062 } 1063 error = pComponent->GetState(pHandle, &state); 1064 retval = 1; 1065 SendInputBuffer = 0; 1066 EOFevent = 0; 1067 frmCount = 0; 1068 OutBufCount = 0; 1069 InBufCount = 0; 1070 while( (error == OMX_ErrorNone) && ((state != OMX_StateIdle) || (retval>0)) ) { 1071 FD_ZERO(&rfds); 1072 FD_SET(IpBuf_Pipe[0], &rfds); 1073 FD_SET(OpBuf_Pipe[0], &rfds); 1074 tv.tv_sec = 1; 1075 tv.tv_usec = 0; 1076 1077 retval = select(fdmax+1, &rfds, NULL, NULL, &tv); 1078 if(retval == -1) { 1079 perror("select()"); 1080 printf ( " : Error \n"); 1081 break; 1082 } 1083 APP_DPRINT("Input Callbacks pending = %d, Output Last Pending = %d\n", InputCallbacksPending, OutputLastPending); 1084 if( (retval == 0) && (InputCallbacksPending < 1) && (!OutputLastPending) ) { 1085 APP_DPRINT ("%d :: BasicFn App Timeout !!!!!!!!!!! \n",__LINE__); 1086 fprintf(stderr, "Shutting down Since there is nothing else to send nor read---------- \n"); 1087 StopComponent(pHandle); 1088 } 1089 1090 /* FREE input buffer */ 1091 if(FD_ISSET(IpBuf_Pipe[0], &rfds)) { 1092 read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer)); 1093 InputCallbacksPending--; 1094 InBufCount++; 1095 frmCount+=packetsPerBuffer; 1096 APP_DPRINT("frame count = %d\n", frmCount); 1097 if(pBuffer->nFlags==1){ /* Last input buffer received by App */ 1098 InputCallbacksPending = 0; 1099 } 1100 if( ((2==command) || (4==command)) && (600 == frmCount)){ /*Stop Tests*/ 1101 fprintf(stderr, "Send STOP Command to component ---------- \n"); 1102 StopComponent(pHandle); 1103 } 1104 1105 pBuffer->nFlags = 0; 1106 1107 if (state == OMX_StateExecuting){ 1108 if(!EOFevent){ 1109 error = send_input_buffer (pHandle, pBuffer, fIn); 1110 } 1111 else{ 1112 printf("EOF, not sending input\n"); 1113 } 1114 if (error != OMX_ErrorNone) { 1115 bExitOnError = OMX_TRUE; 1116 goto EXIT; 1117 } 1118 } 1119 1120 if(3 == command){ /*Pause Test*/ 1121 if(frmCount == 100) { /*100 Frames processed */ 1122 printf (" Sending Pause command to Codec \n"); 1123 PauseComponent(pHandle); 1124 printf("5 secs sleep...\n"); 1125 sleep(5); 1126 printf (" Sending Resume command to Codec \n"); 1127 PlayComponent(pHandle); 1128 } 1129 } 1130 else if ( 7 == command ){ /*Mute and UnMuteTest*/ 1131 if(frmCount == 100){ 1132 printf("************Mute the playback stream*****************\n"); 1133 pCompPrivateStructMute->bMute = OMX_TRUE; 1134 error = OMX_SetConfig(pHandle, OMX_IndexConfigAudioMute, pCompPrivateStructMute); 1135 if (error != OMX_ErrorNone) 1136 { 1137 error = OMX_ErrorBadParameter; 1138 bExitOnError = OMX_TRUE; 1139 goto EXIT; 1140 } 1141 } 1142 else if(frmCount == 400) { 1143 printf("************Unmute the playback stream*****************\n"); 1144 pCompPrivateStructMute->bMute = OMX_FALSE; 1145 error = OMX_SetConfig(pHandle, OMX_IndexConfigAudioMute, pCompPrivateStructMute); 1146 if (error != OMX_ErrorNone) { 1147 error = OMX_ErrorBadParameter; 1148 bExitOnError = OMX_TRUE; 1149 goto EXIT; 1150 } 1151 } 1152 } 1153 else if ( 8 == command ) { /*Set Volume Test*/ 1154 if(frmCount == 600){ 1155 printf("************Set stream volume to high*****************\n"); 1156 pCompPrivateStructVolume->sVolume.nValue = 0x7500; 1157 error = OMX_SetConfig(pHandle, OMX_IndexConfigAudioVolume, pCompPrivateStructVolume); 1158 if (error != OMX_ErrorNone) { 1159 error = OMX_ErrorBadParameter; 1160 bExitOnError = OMX_TRUE; 1161 goto EXIT; 1162 } 1163 } 1164 else if(frmCount == 1200) { 1165 printf("************Set stream volume to low*****************\n"); 1166 pCompPrivateStructVolume->sVolume.nValue = 0x2500; 1167 error = OMX_SetConfig(pHandle, OMX_IndexConfigAudioVolume, pCompPrivateStructVolume); 1168 if (error != OMX_ErrorNone) { 1169 error = OMX_ErrorBadParameter; 1170 bExitOnError = OMX_TRUE; 1171 goto EXIT; 1172 } 1173 } 1174 } 1175 } 1176 1177 if( FD_ISSET(OpBuf_Pipe[0], &rfds)) { 1178 read(OpBuf_Pipe[0], &pBuf, sizeof(pBuf)); 1179 APP_DPRINT("reading from output buffer pipe\n"); 1180 OutBufCount++; 1181 if ((state != OMX_StateExecuting) && (pBuf->nFilledLen > 0)){ 1182 printf("Writing remaining output buffer\n"); 1183 } 1184 APP_DPRINT ("FWRITE output buffer of size %d\n",pBuf->nFilledLen); 1185 if(pBuf->nFlags!=1){ 1186 fwrite(pBuf->pBuffer, 1, pBuf->nFilledLen, fOut); 1187 fflush(fOut); 1188 if (state == OMX_StateExecuting ) { 1189 pComponent->FillThisBuffer(pHandle, pBuf); 1190 } 1191 } 1192 else{/* Last output frame = dummy frame from DSP */ 1193 OutputLastPending = 0; 1194 InputCallbacksPending = 0; 1195 pBuf->nFlags = 0; 1196 } 1197 } 1198 error = pComponent->GetState(pHandle, &state); 1199 if(error != OMX_ErrorNone) { 1200 printf("%d:: Warning: hG729Decoder->GetState has returned status %X\n", __LINE__, error); 1201 bExitOnError = OMX_TRUE; 1202 goto EXIT; 1203 } 1204 } /* While Loop Ending Here */ 1205 if(audioinfo->dasfMode == 0){ 1206 fclose(fOut); 1207 } 1208 fclose(fIn); 1209 fclose(fp); 1210 printf("Number of free input buffers received by test app. : %d\n",InBufCount); 1211 printf("Number of free output buffers received by test app. : %d\n",OutBufCount); 1212 if((command == 2) || (( command == 5)&&(audioinfo->dasfMode == 0)) || (( command == 6)&&(audioinfo->dasfMode == 0))) { 1213 sleep (2); 1214 } 1215 } /*Inner for loop ends here */ 1216 1217 1218 printf("Free buffers\n"); 1219 /* free buffers */ 1220 for (i=0; i < numInputBuffers; i++) { 1221 error = OMX_FreeBuffer(pHandle,OMX_DirInput,pInputBufferHeader[i]); 1222 if( (error != OMX_ErrorNone)) { 1223 APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__); 1224 bExitOnError = OMX_TRUE; 1225 goto EXIT; 1226 } 1227 if(pInBufferParam[i] != NULL){ 1228 free(pInBufferParam[i]); 1229 pInBufferParam[i] = NULL; 1230 } 1231 } 1232 for (i=0; i < numOutputBuffers; i++) { 1233 error = OMX_FreeBuffer(pHandle,OMX_DirOutput,pOutputBufferHeader[i]); 1234 if( (error != OMX_ErrorNone)) { 1235 APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__); 1236 bExitOnError = OMX_TRUE; 1237 goto EXIT; 1238 } 1239 } 1240 1241#ifdef USE_BUFFER 1242 /* free the App Allocated Buffers */ 1243 printf("%d :: App: Freeing the App Allocated Buffers in TestApp\n",__LINE__); 1244 for(i=0; i < numInputBuffers; i++) { 1245 pInputBuffer[i] = pInputBuffer[i] - CACHE_ALIGNMENT; 1246 APP_MEMPRINT("%d :: App: [TESTAPPFREE] pInputBuffer[%d] = %p\n",__LINE__,i,pInputBuffer[i]); 1247 if(pInputBuffer[i] != NULL){ 1248 free(pInputBuffer[i]); 1249 pInputBuffer[i] = NULL;; 1250 } 1251 1252 } 1253 1254 for(i=0; i < numOutputBuffers; i++) { 1255 pOutputBuffer[i] = pOutputBuffer[i] - 128; 1256 APP_MEMPRINT("%d :: App: [TESTAPPFREE] pOutputBuffer[%d] = %p\n",__LINE__,i, pOutputBuffer[i]); 1257 if(pOutputBuffer[i] != NULL){ 1258 free(pOutputBuffer[i]); 1259 pOutputBuffer[i] = NULL; 1260 } 1261 } 1262#endif 1263 printf ("Sending the StateLoaded Command\n"); 1264 1265#ifdef OMX_GETTIME 1266 GT_START(); 1267#endif 1268 1269 error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateLoaded, NULL); 1270 error = WaitForState(pHandle, OMX_StateLoaded); 1271#ifdef OMX_GETTIME 1272 GT_END("Call to SendCommand <OMX_StateLoaded>"); 1273#endif 1274 1275 if(error != OMX_ErrorNone) { 1276 APP_DPRINT ("%d:: Error from SendCommand-Idle State function\n",__LINE__); 1277 bExitOnError = OMX_TRUE; 1278 goto EXIT; 1279 } 1280 1281 error = OMX_SendCommand(pHandle, OMX_CommandPortDisable, -1, NULL); 1282 1283 printf ("Free the Component handle\n"); 1284 /* Unload the G729 Decoder Component */ 1285 error = TIOMX_FreeHandle(pHandle); 1286 if( (error != OMX_ErrorNone)) { 1287 APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__); 1288 goto EXIT; 1289 } 1290 APP_DPRINT ("%d:: Free Handle returned Successfully \n\n\n\n",__LINE__); 1291 free(pG729Param); 1292 free(pPcmParam); 1293 free(pCompPrivateStruct); 1294 free(pCompPrivateStructMute); 1295 free(pCompPrivateStructVolume); 1296 close(IpBuf_Pipe[0]); 1297 close(IpBuf_Pipe[1]); 1298 close(OpBuf_Pipe[0]); 1299 close(OpBuf_Pipe[1]); 1300 APP_DPRINT("Freed resources successfully\n"); 1301 } /*Outer for loop ends here */ 1302 free(audioinfo); 1303 1304 /* De-Initialize OMX Core */ 1305 error = TIOMX_Deinit(); 1306 if (error != OMX_ErrorNone) { 1307 printf("APP::Failed to de-init OMX Core!\n"); 1308 } 1309 1310#ifdef DSP_RENDERING_ON 1311 cmd_data.hComponent = pHandle; 1312 cmd_data.AM_Cmd = AM_Exit; 1313 if((write(g729decfdwrite, &cmd_data, sizeof(cmd_data)))<0) 1314 { 1315 printf("%d ::OMX_G729Decoder.c :: [G729 Dec Component] - send command to audio manager\n",__LINE__); 1316 } 1317 close(g729decfdwrite); 1318 close(g729decfdread); 1319#endif 1320 1321 EXIT: 1322 1323 if (bExitOnError){ 1324#ifdef USE_BUFFER 1325 FreeResources(pG729Param, pPcmParam, pCompPrivateStruct, 1326 pCompPrivateStructMute, pCompPrivateStructVolume, 1327 audioinfo, pInputBuffer, pOutputBuffer, pInBufferParam, pHandle); 1328#else 1329 1330 FreeResources(pG729Param, pPcmParam, pCompPrivateStruct, 1331 pCompPrivateStructMute, pCompPrivateStructVolume, 1332 audioinfo, pInputBufferHeader, pOutputBufferHeader, pInBufferParam, pHandle); 1333#endif 1334 error = TIOMX_FreeHandle(pHandle); 1335 if( (error != OMX_ErrorNone)) { 1336 APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__); 1337 goto EXIT; 1338 } 1339 } 1340 1341#ifdef OMX_GETTIME 1342 GT_END("G729_DEC test <End>"); 1343 OMX_ListDestroy(pListHead); 1344#endif 1345 1346#ifdef MTRACE 1347 muntrace(); 1348#endif 1349 1350 return error; 1351} 1352 1353OMX_ERRORTYPE send_input_buffer(OMX_HANDLETYPE pHandle, OMX_BUFFERHEADERTYPE* pBuffer, FILE *fIn) 1354{ 1355 OMX_ERRORTYPE error = OMX_ErrorNone; 1356 OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)pHandle; 1357 OMX_S16 status = 0; 1358 1359 status = fill_data_fromFile (pBuffer, fIn, pHandle); 1360 pBuffer->nTimeStamp = (OMX_S64) rand() % 70; 1361 pBuffer->nTickCount = (OMX_S64) rand() % 70; 1362 if (command == 0){ 1363 APP_DPRINT("SENDING TIMESTAMP = %d\n", (int) pBuffer->nTimeStamp); 1364 APP_DPRINT("SENDING TICK COUNT = %ld\n", pBuffer->nTickCount); 1365 } 1366 if(status>=0){ 1367 SendInputBuffer++; 1368 InputCallbacksPending++; 1369 pComponent->EmptyThisBuffer(pHandle, pBuffer); 1370 } 1371 else{ 1372 error = OMX_ErrorStreamCorrupt; 1373 } 1374 return error; 1375} 1376 1377 1378/* ===========================================================================*/ 1379/** 1380 * @fn fill_data_fromFile fills input buffer with 1 G729 frame from input test file 1381 * Conversion from ITU format to frame type header + G729 packet 1382 * 1383 */ 1384/* ===========================================================================*/ 1385OMX_S16 fill_data_fromFile (OMX_BUFFERHEADERTYPE *pBuf, FILE *fIn, OMX_HANDLETYPE pHandle) 1386{ 1387 OMX_S16 nRead = 0; 1388 OMX_S16 nRead2 = 0; 1389 OMX_S16 dRead = 0; 1390 OMX_S16 j = 0, n = 0, k = 0, m = 0; 1391 /* BFI + number of bit in frame + serial bitstream */ 1392 OMX_S16 serial[ITU_INPUT_SIZE]; 1393 /* G729 frame type */ 1394 OMX_S16 frame_type = 0; 1395 /* Number of data bytes in packet */ 1396 OMX_U32 nBytes = 0; 1397 /* G729 packet */ 1398 OMX_U8 *packet = NULL; 1399 /* Offset in bytes in input buffer */ 1400 OMX_U8 offset = 0; 1401 G729DEC_BufParamStruct* pBufStructTemp = (G729DEC_BufParamStruct*)pBuf->pInputPortPrivate; 1402 1403 1404 pBufStructTemp->frameLost = 0; 1405 pBufStructTemp->numPackets = packetsPerBuffer; 1406 pBufStructTemp->bNoUseDefaults = OMX_TRUE; 1407 pBuf->nFilledLen = 0; 1408 pBuf->nFlags = 0; 1409 for(j = 0; j < packetsPerBuffer; j++){ /* nb packets in input buffer */ 1410 1411 nRead2=fread(serial, sizeof(OMX_S16), 2 , fp); //this is temporary 1412 /* read BFI and number of bits in frame */ 1413 nRead = fread(serial, sizeof(OMX_S16), 2 , fIn); 1414 if(nRead != 0){ 1415 /* Number of data bytes in packet */ 1416 nBytes = serial[1]>>3; 1417 pBufStructTemp->packetLength[j] = nBytes + 1; 1418 pBuf->nFilledLen += pBufStructTemp->packetLength[j]; 1419 /* read ITU serial bitstream */ 1420 dRead = fread(&serial[2], sizeof(OMX_S16), serial[1], fIn); 1421 if(dRead != serial[1]){ 1422 printf("WARN: Error in input file\n"); 1423 dRead = -1; /*error flag */ 1424 } 1425 /* set frame type */ 1426 switch(nBytes){ 1427 case G729SPEECHPACKETSIZE: 1428 frame_type = SPEECH_FRAME_TYPE; 1429 break; 1430 case G729SIDPACKETSIZE: 1431 frame_type = SID_FRAME_TYPE; 1432 break; 1433 case NO_TX_FRAME_TYPE: 1434 frame_type = NO_TX_FRAME_TYPE; 1435 break; 1436 default: 1437 frame_type = ERASURE_FRAME; 1438 } 1439 if(serial[0]!= SYNC_WORD){ /* Untransmitted frame => Frame erasure flag */ 1440 frame_type = ERASURE_FRAME; 1441 } 1442 /* Add G729 frame type header to G729 input packet */ 1443 *((OMX_U8 *)(&pBuf->pBuffer[0]+offset)) = frame_type; 1444 1445 /* Convert ITU format to bitstream */ 1446 packet = (OMX_U8 *)(&pBuf->pBuffer[0]+offset+1); 1447 if(frame_type == SPEECH_FRAME_TYPE){ 1448 n = 2; 1449 k = 0; 1450 while(n<SPEECH_FRAME_SIZE){ 1451 packet[k] = 0; 1452 for(m=7;m>=0;m--){ 1453 serial[n] = (~(serial[n]) & 0x2)>>1; 1454 packet[k] = packet[k] + (serial[n]<<m); 1455 n++; 1456 } 1457 k++; 1458 } 1459 } 1460 if(frame_type == SID_FRAME_TYPE){ 1461 n = 2; 1462 k = 0; 1463 while(n<SID_OCTET_FRAME_SIZE){ 1464 packet[k] = 0; 1465 for(m=7;m>=0;m--){ 1466 serial[n] = (~(serial[n]) & 0x2)>>1; 1467 packet[k] = packet[k] + (serial[n]<<m); 1468 n++; 1469 } 1470 k++; 1471 } 1472 } 1473 offset = offset + nBytes + 1; 1474 } 1475 else{ 1476 if(offset == 0){/* End of file on a dummy frame */ 1477 /* Set flag on input buffer to indicate Last Frame */ 1478 pBuf->nFlags=OMX_BUFFERFLAG_EOS; 1479 /* Dummy buffer (no data) */ 1480 pBuf->nFilledLen = 0; 1481 EOFevent = 1; 1482 printf("End of file on a dummy frame \n"); 1483 } 1484 else{/* End of file on valid frame */ 1485 pBuf->nFlags=OMX_BUFFERFLAG_EOS; 1486 EOFevent = 1; 1487 printf("End of file on a valid frame \n"); 1488 } 1489 if(dasfMode==0){ 1490 OutputLastPending = 1; 1491 } 1492 j = packetsPerBuffer; /* break */ 1493 } 1494 } 1495 return dRead; 1496} 1497 1498void ConfigureAudio() 1499{ 1500 int Mixer = 0, arg = 0, status = 0; 1501 1502 Mixer = open("/dev/sound/mixer", O_WRONLY); 1503 if (Mixer < 0) { 1504 perror("open of /dev/sound/mixer failed"); 1505 exit(1); 1506 } 1507 arg = G729DEC_SAMPLING_FREQUENCY; /* sampling rate */ 1508 printf("Sampling freq set to:%d\n",arg); 1509 status = ioctl(Mixer, SOUND_PCM_WRITE_RATE, &arg); 1510 if (status == -1) { 1511 perror("SOUND_PCM_WRITE_RATE ioctl failed"); 1512 printf("sample rate set to %u\n", arg); 1513 } 1514 arg = AFMT_S16_LE; /* AFMT_S16_LE or AFMT_S32_LE */ 1515 status = ioctl(Mixer, SOUND_PCM_SETFMT, &arg); 1516 if (status == -1) { 1517 perror("SOUND_PCM_SETFMT ioctl failed"); 1518 printf("Bitsize set to %u\n", arg); 1519 } 1520 arg = 2; /* Channels mono 1 stereo 2 */ 1521 status = ioctl(Mixer, SOUND_PCM_WRITE_CHANNELS, &arg); 1522 if (status == -1) { 1523 perror("SOUND_PCM_WRITE_CHANNELS ioctl failed"); 1524 printf("Channels set to %u\n", arg); 1525 } 1526 arg = GAIN<<8|GAIN; 1527 status = ioctl(Mixer, SOUND_MIXER_WRITE_VOLUME, &arg); 1528 if (status == -1) { 1529 perror("SOUND_MIXER_WRITE_VOLUME ioctl failed"); 1530 printf("Volume set to %u\n", arg); 1531 } 1532} 1533 1534OMX_ERRORTYPE StopComponent(OMX_HANDLETYPE *pHandle) 1535{ 1536 OMX_ERRORTYPE error = OMX_ErrorNone; 1537 1538#ifdef OMX_GETTIME 1539 GT_START(); 1540#endif 1541 1542 error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL); 1543 if(error != OMX_ErrorNone) { 1544 fprintf (stderr,"\nError from SendCommand-Idle(Stop) State function!!!!!!!!\n"); 1545 goto EXIT; 1546 } 1547 error = WaitForState(pHandle, OMX_StateIdle); 1548 1549#ifdef OMX_GETTIME 1550 GT_END("Call to SendCommand <OMX_StateIdle>"); 1551#endif 1552 1553 if(error != OMX_ErrorNone) { 1554 fprintf(stderr, "\nError: hG729Decoder->WaitForState reports an error %X!!!!!!!\n", error); 1555 goto EXIT; 1556 } 1557 EXIT: 1558 return error; 1559} 1560 1561OMX_ERRORTYPE PauseComponent(OMX_HANDLETYPE *pHandle) 1562{ 1563 OMX_ERRORTYPE error = OMX_ErrorNone; 1564 1565#ifdef OMX_GETTIME 1566 GT_START(); 1567#endif 1568 1569 error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StatePause, NULL); 1570 if(error != OMX_ErrorNone) { 1571 fprintf (stderr,"\nError from SendCommand-Pasue State function!!!!!!\n"); 1572 goto EXIT; 1573 } 1574 error = WaitForState(pHandle, OMX_StatePause); 1575 1576#ifdef OMX_GETTIME 1577 GT_END("Call to SendCommand <OMX_StatePause>"); 1578#endif 1579 1580 if(error != OMX_ErrorNone) { 1581 fprintf(stderr, "\nError: hG729Decoder->WaitForState reports an error %X!!!!!!!\n", error); 1582 goto EXIT; 1583 } 1584 EXIT: 1585 return error; 1586} 1587 1588OMX_ERRORTYPE PlayComponent(OMX_HANDLETYPE *pHandle) 1589{ 1590 OMX_ERRORTYPE error = OMX_ErrorNone; 1591#ifdef OMX_GETTIME 1592 GT_START(); 1593#endif 1594 error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateExecuting, NULL); 1595 if(error != OMX_ErrorNone) { 1596 fprintf (stderr,"\nError from SendCommand-Executing State function!!!!!!!\n"); 1597 goto EXIT; 1598 } 1599 error = WaitForState(pHandle, OMX_StateExecuting); 1600#ifdef OMX_GETTIME 1601 GT_END("Call to SendCommand <OMX_StateExecuting>"); 1602#endif 1603 if(error != OMX_ErrorNone) { 1604 fprintf(stderr, "\nError: hG729Decoder->WaitForState reports an error %X!!!!!!!\n", error); 1605 goto EXIT; 1606 } 1607 EXIT: 1608 return error; 1609} 1610 1611#ifdef USE_BUFFER 1612OMX_ERRORTYPE FreeResources(OMX_AUDIO_PARAM_G729TYPE* pG729Param, 1613 OMX_AUDIO_PARAM_PCMMODETYPE* pPcmParam, 1614 OMX_PARAM_PORTDEFINITIONTYPE* pCompPrivateStruct, 1615 OMX_AUDIO_CONFIG_MUTETYPE* pCompPrivateStructMute, 1616 OMX_AUDIO_CONFIG_VOLUMETYPE* pCompPrivateStructVolume, 1617 TI_OMX_DSP_DEFINITION* audioinfo, 1618 OMX_U8* pInputBuffer[10], 1619 OMX_U8* pOutputBuffer[10], 1620 G729DEC_BufParamStruct* pInBufferParam[10], 1621 OMX_HANDLETYPE* pHandle) 1622{ 1623 OMX_ERRORTYPE eError = OMX_ErrorNone; 1624 int i = 0; 1625 1626 printf("Free buffers\n"); 1627 /* free buffers */ 1628 for (i=0; i < numInputBuffers; i++) { 1629 eError = OMX_FreeBuffer(pHandle,OMX_DirInput,pInputBufferHeader[i]); 1630 if( (eError != OMX_ErrorNone)) { 1631 APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__); 1632 goto EXIT; 1633 } 1634 if(pInBufferParam[i] != NULL){ 1635 free(pInBufferParam[i]); 1636 pInBufferParam[i] = NULL; 1637 } 1638 } 1639 1640 for (i=0; i < numOutputBuffers; i++) { 1641 eError = OMX_FreeBuffer(pHandle,OMX_DirOutput,pOutputBufferHeader[i]); 1642 if( (eError != OMX_ErrorNone)) { 1643 APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__); 1644 printf("%d:: Error in Free Handle function\n",__LINE__); 1645 goto EXIT; 1646 } 1647 } 1648 free(pG729Param); 1649 free(pPcmParam); 1650 free(pCompPrivateStruct); 1651 free(pCompPrivateStructMute); 1652 free(pCompPrivateStructVolume); 1653 1654 close(IpBuf_Pipe[0]); 1655 close(IpBuf_Pipe[1]); 1656 close(OpBuf_Pipe[0]); 1657 close(OpBuf_Pipe[1]); 1658 free(audioinfo); 1659 1660 EXIT: 1661 return eError; 1662} 1663 1664#else 1665 1666OMX_ERRORTYPE FreeResources(OMX_AUDIO_PARAM_G729TYPE* pG729Param, 1667 OMX_AUDIO_PARAM_PCMMODETYPE* pPcmParam, 1668 OMX_PARAM_PORTDEFINITIONTYPE* pCompPrivateStruct, 1669 OMX_AUDIO_CONFIG_MUTETYPE* pCompPrivateStructMute, 1670 OMX_AUDIO_CONFIG_VOLUMETYPE* pCompPrivateStructVolume, 1671 TI_OMX_DSP_DEFINITION* audioinfo, 1672 OMX_BUFFERHEADERTYPE* pInputBufferHeader[10], 1673 OMX_BUFFERHEADERTYPE* pOutputBufferHeader[10], 1674 G729DEC_BufParamStruct* pInBufferParam[10], 1675 OMX_HANDLETYPE* pHandle) 1676{ 1677 OMX_ERRORTYPE eError = OMX_ErrorNone; 1678 int i = 0; 1679 1680 printf("Free buffers\n"); 1681 /* free buffers */ 1682 for (i=0; i < numInputBuffers; i++) { 1683 eError = OMX_FreeBuffer(pHandle,OMX_DirInput,pInputBufferHeader[i]); 1684 if( (eError != OMX_ErrorNone)) { 1685 APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__); 1686 goto EXIT; 1687 } 1688 if(pInBufferParam[i] != NULL){ 1689 free(pInBufferParam[i]); 1690 pInBufferParam[i] = NULL; 1691 } 1692 } 1693 for (i=0; i < numOutputBuffers; i++) { 1694 eError = OMX_FreeBuffer(pHandle,OMX_DirOutput,pOutputBufferHeader[i]); 1695 if( (eError != OMX_ErrorNone)) { 1696 APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__); 1697 printf("%d:: Error in Free Handle function\n",__LINE__); 1698 goto EXIT; 1699 } 1700 } 1701 free(pG729Param); 1702 free(pPcmParam); 1703 free(pCompPrivateStruct); 1704 free(pCompPrivateStructMute); 1705 free(pCompPrivateStructVolume); 1706 close(IpBuf_Pipe[0]); 1707 close(IpBuf_Pipe[1]); 1708 close(OpBuf_Pipe[0]); 1709 close(OpBuf_Pipe[1]); 1710 free(audioinfo); 1711 1712 EXIT: 1713 return eError; 1714} 1715#endif 1716