3 * Copyright 2001-2008 Texas Instruments - http://www.ti.com/
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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 /* ================================================================================
18 * Texas Instruments OMAP(TM) Platform Software
19 * (c) Copyright Texas Instruments, Incorporated. All Rights Reserved.
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 * ================================================================================ */
27 * This File contains the G729 DECODER OMX tests
29 * @path $(OMAPSW_MPU)\linux\audio\src\openmax_il\g729_dec\tests
33 /* -----------------------------------------------------------------------------
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.
46 * ================================================================================= */
47 /****************************************************************
49 ****************************************************************/
51 /* ----- system and platform files ----------------------------*/
54 #include <sys/ioctl.h>
55 #include <sys/select.h>
64 #include <linux/soundcard.h>
67 /*-------program files ----------------------------------------*/
68 #include <OMX_Index.h>
69 #include <OMX_Types.h>
72 #include <OMX_Audio.h>
73 #include <G729DecTest.h>
74 #include <OMX_G729Decoder.h>
77 #include <OMX_Common_Utils.h>
78 #include <OMX_GetTime.h> /*Headers for Performance & measuremet */
81 /* ------compilation control switches -------------------------*/
87 /* ======================================================================= */
89 * @def DASF Define a Value for DASF mode
91 /* ======================================================================= */
93 /* ======================================================================= */
95 * @def GAIN Define a GAIN value for Configure Audio
97 /* ======================================================================= */
99 /* ======================================================================= */
101 * @def G729DEC_SAMPLING_FREQUENCY Sampling Frequency
103 /* ======================================================================= */
104 #define G729DEC_SAMPLING_FREQUENCY 8000
105 /* ======================================================================= */
107 * @def EXTRA_BUFFBYTES Num of Extra Bytes to be allocated
109 /* ======================================================================= */
110 #define EXTRA_BUFFBYTES (256)
112 /* ======================================================================= */
114 * @def CACHE_ALIGNMENT Buffer Cache Alignment
116 /* ======================================================================= */
117 #define CACHE_ALIGNMENT 128
122 #define FIFO1 "/dev/fifo.1"
123 #define FIFO2 "/dev/fifo.2"
125 /****************************************************************
126 * EXTERNAL REFERENCES NOTE : only use if not found in header file
127 ****************************************************************/
128 /*--------data declarations -----------------------------------*/
129 /*--------function prototypes ---------------------------------*/
131 /****************************************************************
132 * PUBLIC DECLARATIONS Defined here, used elsewhere
133 ****************************************************************/
134 /*--------data declarations -----------------------------------*/
136 /*--------function prototypes ---------------------------------*/
138 /****************************************************************
139 * PRIVATE DECLARATIONS Defined here, used only here
140 ****************************************************************/
141 /*--------data declarations -----------------------------------*/
144 OMX_ERRORTYPE eError = OMX_ErrorNone;
145 int GT_FlagE = 0; /* Fill Buffer 1 = First Buffer, 0 = Not First Buffer */
146 int GT_FlagF = 0; /*Empty Buffer 1 = First Buffer, 0 = Not First Buffer */
147 static OMX_NODE* pListHead = NULL;
151 OMX_S16 inputPortDisabled = 0;
152 OMX_S16 outputPortDisabled = 0;
153 OMX_S8 InputCallbacksPending = 0;
154 OMX_S8 OutputLastPending = 0;
156 typedef enum COMPONENTS {
161 OMX_STRING strG729Decoder = "OMX.TI.G729.decode";
162 int IpBuf_Pipe[2] = {0};
163 int OpBuf_Pipe[2] = {0};
165 OMX_S16 dasfMode = 0;
166 OMX_S16 packetsPerBuffer = 0;
167 OMX_S16 EOFevent = 0;
168 OMX_BOOL bExitOnError = OMX_FALSE;
171 #ifdef DSP_RENDERING_ON
172 AM_COMMANDDATATYPE cmd_data;
175 /*--------function prototypes ---------------------------------*/
176 OMX_S16 maxint(OMX_S16 a, OMX_S16 b);
177 OMX_ERRORTYPE StopComponent(OMX_HANDLETYPE *pHandle);
178 OMX_ERRORTYPE PauseComponent(OMX_HANDLETYPE *pHandle);
179 OMX_ERRORTYPE PlayComponent(OMX_HANDLETYPE *pHandle);
180 OMX_S16 fill_data_fromFile (OMX_BUFFERHEADERTYPE *pBuf, FILE *fIn, OMX_HANDLETYPE pHandle);
181 void ConfigureAudio();
182 OMX_ERRORTYPE send_input_buffer (OMX_HANDLETYPE pHandle, OMX_BUFFERHEADERTYPE* pBuffer, FILE *fIn);
185 OMX_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);
196 OMX_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);
209 /*--------macros ----------------------------------------------*/
211 #define APP_DPRINT(...) fprintf(stderr,__VA_ARGS__)
213 #define APP_DPRINT(...)
217 #define DPRINT(...) fprintf(stderr,__VA_ARGS__)
223 #define APP_MEMPRINT(...) fprintf(stderr,__VA_ARGS__)
225 #define APP_MEMPRINT(...)
229 /* safe routine to get the maximum of 2 integers */
230 OMX_S16 maxint(OMX_S16 a, OMX_S16 b)
232 return (a>b) ? a : b;
235 #define OMX_G729APP_INIT_STRUCT(_s_, _name_) \
236 memset((_s_), 0x0, sizeof(_name_)); \
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; \
247 APP_MEMPRINT("%d :: ALLOCATING MEMORY = %p\n",__LINE__,_pStruct_);
249 /* This method will wait for the component to get to the state
250 * specified by the DesiredState input. */
251 static OMX_ERRORTYPE WaitForState(OMX_HANDLETYPE* pHandle,
252 OMX_STATETYPE DesiredState)
254 OMX_STATETYPE CurState = OMX_StateInvalid;
255 OMX_ERRORTYPE eError = OMX_ErrorNone;
257 OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)pHandle;
258 eError = pComponent->GetState(pHandle, &CurState);
260 while((eError == OMX_ErrorNone) && (CurState != DesiredState) && (eError == OMX_ErrorNone) ) {
263 APP_DPRINT( "Still Waiting, press CTL-C to continue\n");
265 eError = pComponent->GetState(pHandle, &CurState);
272 OMX_ERRORTYPE EventHandler(
273 OMX_HANDLETYPE hComponent,
275 OMX_EVENTTYPE eEvent,
281 OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)hComponent;
282 OMX_STATETYPE state = OMX_StateInvalid;
283 OMX_ERRORTYPE eError = OMX_ErrorNone;
286 int iComp = *((int *)(pAppData));
289 eError = pComponent->GetState (hComponent, &state);
290 if(eError != OMX_ErrorNone) {
291 APP_DPRINT("%d :: App: Error returned from GetState\n",__LINE__);
294 case OMX_EventCmdComplete:
296 if(nData1 == OMX_CommandPortDisable){
297 if (nData2 == OMX_DirInput) {
298 inputPortDisabled = 1;
300 if (nData2 == OMX_DirOutput) {
301 outputPortDisabled = 1;
304 else if(nData1 == OMX_CommandStateSet){
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 */
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 */
333 void FillBufferDone (OMX_HANDLETYPE hComponent, OMX_PTR ptr, OMX_BUFFERHEADERTYPE* pBufferO)
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));
340 if (GT_FlagF == 1 ) /* First Buffer Reply*/ /* 1 = First Buffer, 0 = Not First Buffer */
342 GT_END("Call to FillBufferDone <First: FillBufferDone>");
343 GT_FlagF = 0 ; /* 1 = First Buffer, 0 = Not First Buffer */
350 void EmptyBufferDone(OMX_HANDLETYPE hComponent, OMX_PTR ptr, OMX_BUFFERHEADERTYPE* pBufferI)
353 APP_DPRINT ("APP:::: INPUT BUFFER = %p && %p\n",pBufferI, pBufferI->pBuffer);
355 APP_DPRINT("output: pBuffer->nTimeStamp = %d\n", (int)pBufferI->nTimeStamp);
356 APP_DPRINT("output: pBuffer->nTickCount = %ld\n", pBufferI->nTickCount);
358 ret = write(IpBuf_Pipe[1], &pBufferI, sizeof(pBufferI));
361 if (GT_FlagE == 1 ) /* First Buffer Reply*/ /* 1 = First Buffer, 0 = Not First Buffer */
363 GT_END("Call to EmptyBufferDone <First: EmptyBufferDone>");
364 GT_FlagE = 0; /* 1 = First Buffer, 0 = Not First Buffer */
371 OMX_S16 SendInputBuffer = 0;
372 OMX_S16 numInputBuffers = 0;
373 OMX_S16 numOutputBuffers = 0;
376 int main(int argc, char* argv[])
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};
395 OMX_U8* pInputBuffer[10] = {NULL};
396 OMX_U8* pOutputBuffer[10]= {NULL};
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;
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;
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");
428 GTeError = OMX_ListCreate(&pListHead);
429 printf("eError = %d\n",GTeError);
433 #ifdef DSP_RENDERING_ON
434 if((g729decfdwrite=open(FIFO1,O_WRONLY))<0) {
435 printf("[G729TEST] - failure to open WRITE pipe\n");
438 printf("[G729TEST] - opened WRITE pipe\n");
441 if((g729decfdread=open(FIFO2,O_RDONLY))<0) {
442 printf("[G729TEST] - failure to open READ pipe\n");
443 bExitOnError = OMX_TRUE;
447 printf("[G729TEST] - opened READ pipe\n");
451 /* check the input parameters */
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;
459 numInputBuffers = atoi(argv[5]);
460 numOutputBuffers = atoi(argv[6]);
462 /* validate number of buffers input from command */
463 if(numInputBuffers < 1 || numInputBuffers > 4)
465 printf("Please use between at least 1 but no more than 4 input buffers\n");
466 bExitOnError = OMX_TRUE;
469 if(numOutputBuffers < 1 || numOutputBuffers > 4)
471 printf("Please use between at least 1 but no more than 4 output buffers\n");
472 bExitOnError = OMX_TRUE;
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);
481 printf("Number of packets per buffer should be between 1 and 6\n");
482 bExitOnError = OMX_TRUE;
486 /* check to see that the input file exists */
487 struct stat sb = {0};
488 OMX_S16 status = stat(argv[1], &sb);
490 APP_DPRINT( "Cannot find file %s. (%u)\n", argv[1], errno);
491 bExitOnError = OMX_TRUE;
495 /* Open the file of data to be decoded */
496 FILE* fIn = fopen(argv[1], "r");
497 fp =fopen(argv[1], "r");
499 APP_DPRINT( "Error: failed to open the file %s for readonly\access\n", argv[1]);
500 bExitOnError = OMX_TRUE;
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");
510 APP_DPRINT( "Error: failed to create the output file %s\n", argv[2]);
511 bExitOnError = OMX_TRUE;
516 /* Create a pipe used to queue data from the callback. */
517 retval = pipe(IpBuf_Pipe);
519 APP_DPRINT( "Error:Fill Data Pipe failed to open\n");
520 bExitOnError = OMX_TRUE;
524 retval = pipe(OpBuf_Pipe);
526 APP_DPRINT( "Error:Empty Data Pipe failed to open\n");
527 bExitOnError = OMX_TRUE;
531 /* save off the "max" of the handles for the selct statement */
532 OMX_S16 fdmax = maxint(IpBuf_Pipe[0], OpBuf_Pipe[0]);
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;
543 /* Test case number */
544 command = atoi(argv[3]);
545 APP_DPRINT("%d :: G729Test\n",__LINE__);
548 printf ("-------------------------------------\n");
549 printf ("Testing Time stamp and Tick count \n");
550 printf ("-------------------------------------\n");
553 printf ("-------------------------------------\n");
554 printf ("Testing Simple PLAY till EOF \n");
555 printf ("-------------------------------------\n");
558 printf ("-------------------------------------\n");
559 printf ("Testing Stop and Play \n");
560 printf ("-------------------------------------\n");
563 printf ("-------------------------------------\n");
564 printf ("Testing PAUSE & RESUME Command\n");
565 printf ("-------------------------------------\n");
568 printf ("---------------------------------------------\n");
569 printf ("Testing STOP Command by Stopping In-Between\n");
570 printf ("---------------------------------------------\n");
573 printf ("-------------------------------------------------\n");
574 printf ("Testing Repeated PLAY without Deleting Component\n");
575 printf ("-------------------------------------------------\n");
579 printf ("------------------------------------------------\n");
580 printf ("Testing Repeated PLAY with Deleting Component\n");
581 printf ("------------------------------------------------\n");
585 printf ("------------------------------------------------------------\n");
586 printf ("Testing Mute/Unmute for Playback Stream\n");
587 printf ("------------------------------------------------------------\n");
590 printf ("------------------------------------------------------------\n");
591 printf ("Testing Set Volume for Playback Stream\n");
592 printf ("------------------------------------------------------------\n");
595 printf("------------------------------------------------------------\n");
596 printf("Wrong test case number. Valid test number from 1 to 8\n");
597 bExitOnError = OMX_TRUE;
601 if(!(strcmp(argv[4],"FM"))) {
602 audioinfo->dasfMode = 0;
604 printf("NON DASF MODE\n");
606 else if(!(strcmp(argv[4],"DM"))){
607 audioinfo->dasfMode = 1;
609 printf("DASF MODE\n");
611 #if STATE_TRANSITION_STATE
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;
624 APP_DPRINT("%d :: G729Test\n",__LINE__);
625 for(j = 0; j < testcnt1; j++) {
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]);
634 /* Create a pipe used to queue data from the callback. */
635 retval = pipe( IpBuf_Pipe);
637 APP_DPRINT( "Error:Fill Data Pipe failed to open\n");
638 bExitOnError = OMX_TRUE;
642 retval = pipe( OpBuf_Pipe);
644 APP_DPRINT( "Error:Empty Data Pipe failed to open\n");
645 bExitOnError = OMX_TRUE;
649 /* Open the input file to be decoded */
650 fIn = fopen(argv[1], "r");
651 fp= fopen(argv[1], "r");
653 fprintf(stderr, "Error: failed to open the file %s for readonly\
655 bExitOnError = OMX_TRUE;
659 /* Open the output file only in non DASF mode */
660 if(audioinfo->dasfMode == 0){
661 fOut = fopen(argv[2], "w");
663 fprintf(stderr, "Error: failed to create the output file \n");
664 bExitOnError = OMX_TRUE;
667 error = TIOMX_Init();
672 /* Load the G729 Decoder Component */
673 APP_DPRINT("%d :: G729Test\n",__LINE__);
677 error = OMX_GetHandle(&pHandle, strG729Decoder, &AppData, &G729CaBa);
678 GT_END("Call to GetHandle");
680 error = TIOMX_GetHandle(&pHandle, strG729Decoder, &AppData, &G729CaBa);
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;
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);
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__);
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;
716 error = OMX_SetParameter (pHandle,OMX_IndexParamPortDefinition,
718 GT_END("Set Parameter Test-SetParameter");
720 error = OMX_SetParameter (pHandle,OMX_IndexParamPortDefinition,
723 if (error != OMX_ErrorNone) {
724 error = OMX_ErrorBadParameter;
725 printf ("%d:: OMX_ErrorBadParameter\n",__LINE__);
726 bExitOnError = OMX_TRUE;
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;
742 error = OMX_SetParameter (pHandle,OMX_IndexParamPortDefinition,
744 GT_END("Set Parameter Test-SetParameter");
746 error = OMX_SetParameter (pHandle,OMX_IndexParamPortDefinition,
750 if (error != OMX_ErrorNone) {
751 error = OMX_ErrorBadParameter;
752 printf ("%d:: OMX_ErrorBadParameter\n",__LINE__);
753 bExitOnError = OMX_TRUE;
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;
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 */
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,
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;
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;
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;
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;
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;
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;
855 error = OMX_SetParameter (pHandle,OMX_IndexParamAudioG729,
857 GT_END("Set Parameter Test-SetParameter");
859 error = OMX_SetParameter (pHandle,OMX_IndexParamAudioG729,
863 if (error != OMX_ErrorNone) {
864 error = OMX_ErrorBadParameter;
865 printf ("%d:: OMX_ErrorBadParameter\n",__LINE__);
866 bExitOnError = OMX_TRUE;
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;
875 error = OMX_SetParameter (pHandle,OMX_IndexParamAudioPcm,
877 GT_END("Set Parameter Test-SetParameter");
879 error = OMX_SetParameter (pHandle,OMX_IndexParamAudioPcm,
882 if (error != OMX_ErrorNone) {
883 error = OMX_ErrorBadParameter;
884 printf ("%d:: OMX_ErrorBadParameter\n",__LINE__);
885 bExitOnError = OMX_TRUE;
889 /* get TeeDN or ACDN mode */
890 audioinfo->acousticMode = OMX_FALSE;
894 dataPath = DATAPATH_APPLICATION_RTMIXER;
898 dataPath = DATAPATH_APPLICATION;
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;
909 #ifdef DSP_RENDERING_ON
910 cmd_data.hComponent = pHandle;
911 cmd_data.AM_Cmd = AM_CommandIsOutputStreamAvailable;
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__);
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;
921 audioinfo->streamId = cmd_data.streamID;
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;
930 /* TODO: should be sure resources are cleaned up at any of the goto EXIT statements */
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;
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;
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;
959 /* Wait for startup to complete */
960 error = WaitForState(pHandle, OMX_StateIdle);
962 GT_END("Call to SendCommand <OMX_StateIdle>");
964 if(error != OMX_ErrorNone) {
965 APP_DPRINT( "Error: hG729Decoder->WaitForState reports an error %X\n", error);
966 bExitOnError = OMX_TRUE;
969 for(i = 0; i < testcnt; i++) { /* PROCESS LOOP */
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]);
977 /* Create a pipe used to queue data from the callback. */
978 retval = pipe(IpBuf_Pipe);
980 APP_DPRINT( "Error:Fill Data Pipe failed to open\n");
981 bExitOnError = OMX_TRUE;
985 retval = pipe(OpBuf_Pipe);
987 APP_DPRINT( "Error:Empty Data Pipe failed to open\n");
988 bExitOnError = OMX_TRUE;
992 /* Open the input file for decoding */
993 fIn = fopen(argv[1], "r");
994 fp= fopen(argv[1], "r");
996 fprintf(stderr, "Error: failed to open the file %s for readonly access\n", argv[1]);
997 bExitOnError = OMX_TRUE;
1001 /* Open the output file only in non DASF mode */
1002 if(audioinfo->dasfMode == 0){
1003 fOut = fopen(argv[2], "w");
1005 fprintf(stderr, "Error: failed to create the output file \n");
1006 bExitOnError = OMX_TRUE;
1011 printf ("Basic Function:: Sending OMX_StateExecuting Command\n");
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;
1021 pComponent = (OMX_COMPONENTTYPE *)pHandle;
1022 error = pComponent->GetState(pHandle, &state);
1023 error = WaitForState(pHandle, OMX_StateExecuting);
1025 GT_END("Call to SendCommand <OMX_StateExecuting>");
1027 if(error != OMX_ErrorNone) {
1028 APP_DPRINT( "Error: hG729Decoder->WaitForState reports an error %X\n", error);
1029 bExitOnError = OMX_TRUE;
1033 InputCallbacksPending = 0;
1034 for (k=0; k < numInputBuffers; k++) {
1035 pInputBufferHeader[k]->nFlags = 0;
1040 GT_FlagE=1; /* 1 = First Buffer, 0 = Not First Buffer */
1041 GT_START(); /* Empty Bufffer */
1045 error = send_input_buffer (pHandle, pInputBufferHeader[k], fIn);
1048 if (audioinfo->dasfMode == 0) {
1049 for (k=0; k < numOutputBuffers; k++) {
1050 pOutputBufferHeader[k]->nFlags = 0;
1055 GT_FlagF=1; /* 1 = First Buffer, 0 = Not First Buffer */
1056 GT_START(); /* Fill Buffer */
1060 pComponent->FillThisBuffer(pHandle, pOutputBufferHeader[k]);
1063 error = pComponent->GetState(pHandle, &state);
1065 SendInputBuffer = 0;
1070 while( (error == OMX_ErrorNone) && ((state != OMX_StateIdle) || (retval>0)) ) {
1072 FD_SET(IpBuf_Pipe[0], &rfds);
1073 FD_SET(OpBuf_Pipe[0], &rfds);
1077 retval = select(fdmax+1, &rfds, NULL, NULL, &tv);
1080 printf ( " : Error \n");
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);
1090 /* FREE input buffer */
1091 if(FD_ISSET(IpBuf_Pipe[0], &rfds)) {
1092 read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1093 InputCallbacksPending--;
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;
1100 if( ((2==command) || (4==command)) && (600 == frmCount)){ /*Stop Tests*/
1101 fprintf(stderr, "Send STOP Command to component ---------- \n");
1102 StopComponent(pHandle);
1105 pBuffer->nFlags = 0;
1107 if (state == OMX_StateExecuting){
1109 error = send_input_buffer (pHandle, pBuffer, fIn);
1112 printf("EOF, not sending input\n");
1114 if (error != OMX_ErrorNone) {
1115 bExitOnError = OMX_TRUE;
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");
1126 printf (" Sending Resume command to Codec \n");
1127 PlayComponent(pHandle);
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)
1137 error = OMX_ErrorBadParameter;
1138 bExitOnError = OMX_TRUE;
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;
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;
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;
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");
1181 if ((state != OMX_StateExecuting) && (pBuf->nFilledLen > 0)){
1182 printf("Writing remaining output buffer\n");
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);
1188 if (state == OMX_StateExecuting ) {
1189 pComponent->FillThisBuffer(pHandle, pBuf);
1192 else{/* Last output frame = dummy frame from DSP */
1193 OutputLastPending = 0;
1194 InputCallbacksPending = 0;
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;
1204 } /* While Loop Ending Here */
1205 if(audioinfo->dasfMode == 0){
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))) {
1215 } /*Inner for loop ends here */
1218 printf("Free buffers\n");
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;
1227 if(pInBufferParam[i] != NULL){
1228 free(pInBufferParam[i]);
1229 pInBufferParam[i] = NULL;
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;
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;;
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;
1263 printf ("Sending the StateLoaded Command\n");
1269 error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateLoaded, NULL);
1270 error = WaitForState(pHandle, OMX_StateLoaded);
1272 GT_END("Call to SendCommand <OMX_StateLoaded>");
1275 if(error != OMX_ErrorNone) {
1276 APP_DPRINT ("%d:: Error from SendCommand-Idle State function\n",__LINE__);
1277 bExitOnError = OMX_TRUE;
1281 error = OMX_SendCommand(pHandle, OMX_CommandPortDisable, -1, NULL);
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__);
1290 APP_DPRINT ("%d:: Free Handle returned Successfully \n\n\n\n",__LINE__);
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 */
1304 /* De-Initialize OMX Core */
1305 error = TIOMX_Deinit();
1306 if (error != OMX_ErrorNone) {
1307 printf("APP::Failed to de-init OMX Core!\n");
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)
1315 printf("%d ::OMX_G729Decoder.c :: [G729 Dec Component] - send command to audio manager\n",__LINE__);
1317 close(g729decfdwrite);
1318 close(g729decfdread);
1325 FreeResources(pG729Param, pPcmParam, pCompPrivateStruct,
1326 pCompPrivateStructMute, pCompPrivateStructVolume,
1327 audioinfo, pInputBuffer, pOutputBuffer, pInBufferParam, pHandle);
1330 FreeResources(pG729Param, pPcmParam, pCompPrivateStruct,
1331 pCompPrivateStructMute, pCompPrivateStructVolume,
1332 audioinfo, pInputBufferHeader, pOutputBufferHeader, pInBufferParam, pHandle);
1334 error = TIOMX_FreeHandle(pHandle);
1335 if( (error != OMX_ErrorNone)) {
1336 APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
1342 GT_END("G729_DEC test <End>");
1343 OMX_ListDestroy(pListHead);
1353 OMX_ERRORTYPE send_input_buffer(OMX_HANDLETYPE pHandle, OMX_BUFFERHEADERTYPE* pBuffer, FILE *fIn)
1355 OMX_ERRORTYPE error = OMX_ErrorNone;
1356 OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)pHandle;
1359 status = fill_data_fromFile (pBuffer, fIn, pHandle);
1360 pBuffer->nTimeStamp = (OMX_S64) rand() % 70;
1361 pBuffer->nTickCount = (OMX_S64) rand() % 70;
1363 APP_DPRINT("SENDING TIMESTAMP = %d\n", (int) pBuffer->nTimeStamp);
1364 APP_DPRINT("SENDING TICK COUNT = %ld\n", pBuffer->nTickCount);
1368 InputCallbacksPending++;
1369 pComponent->EmptyThisBuffer(pHandle, pBuffer);
1372 error = OMX_ErrorStreamCorrupt;
1378 /* ===========================================================================*/
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
1384 /* ===========================================================================*/
1385 OMX_S16 fill_data_fromFile (OMX_BUFFERHEADERTYPE *pBuf, FILE *fIn, OMX_HANDLETYPE pHandle)
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 */
1398 OMX_U8 *packet = NULL;
1399 /* Offset in bytes in input buffer */
1401 G729DEC_BufParamStruct* pBufStructTemp = (G729DEC_BufParamStruct*)pBuf->pInputPortPrivate;
1404 pBufStructTemp->frameLost = 0;
1405 pBufStructTemp->numPackets = packetsPerBuffer;
1406 pBufStructTemp->bNoUseDefaults = OMX_TRUE;
1407 pBuf->nFilledLen = 0;
1409 for(j = 0; j < packetsPerBuffer; j++){ /* nb packets in input buffer */
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);
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 */
1425 /* set frame type */
1427 case G729SPEECHPACKETSIZE:
1428 frame_type = SPEECH_FRAME_TYPE;
1430 case G729SIDPACKETSIZE:
1431 frame_type = SID_FRAME_TYPE;
1433 case NO_TX_FRAME_TYPE:
1434 frame_type = NO_TX_FRAME_TYPE;
1437 frame_type = ERASURE_FRAME;
1439 if(serial[0]!= SYNC_WORD){ /* Untransmitted frame => Frame erasure flag */
1440 frame_type = ERASURE_FRAME;
1442 /* Add G729 frame type header to G729 input packet */
1443 *((OMX_U8 *)(&pBuf->pBuffer[0]+offset)) = frame_type;
1445 /* Convert ITU format to bitstream */
1446 packet = (OMX_U8 *)(&pBuf->pBuffer[0]+offset+1);
1447 if(frame_type == SPEECH_FRAME_TYPE){
1450 while(n<SPEECH_FRAME_SIZE){
1453 serial[n] = (~(serial[n]) & 0x2)>>1;
1454 packet[k] = packet[k] + (serial[n]<<m);
1460 if(frame_type == SID_FRAME_TYPE){
1463 while(n<SID_OCTET_FRAME_SIZE){
1466 serial[n] = (~(serial[n]) & 0x2)>>1;
1467 packet[k] = packet[k] + (serial[n]<<m);
1473 offset = offset + nBytes + 1;
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;
1482 printf("End of file on a dummy frame \n");
1484 else{/* End of file on valid frame */
1485 pBuf->nFlags=OMX_BUFFERFLAG_EOS;
1487 printf("End of file on a valid frame \n");
1490 OutputLastPending = 1;
1492 j = packetsPerBuffer; /* break */
1498 void ConfigureAudio()
1500 int Mixer = 0, arg = 0, status = 0;
1502 Mixer = open("/dev/sound/mixer", O_WRONLY);
1504 perror("open of /dev/sound/mixer failed");
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);
1511 perror("SOUND_PCM_WRITE_RATE ioctl failed");
1512 printf("sample rate set to %u\n", arg);
1514 arg = AFMT_S16_LE; /* AFMT_S16_LE or AFMT_S32_LE */
1515 status = ioctl(Mixer, SOUND_PCM_SETFMT, &arg);
1517 perror("SOUND_PCM_SETFMT ioctl failed");
1518 printf("Bitsize set to %u\n", arg);
1520 arg = 2; /* Channels mono 1 stereo 2 */
1521 status = ioctl(Mixer, SOUND_PCM_WRITE_CHANNELS, &arg);
1523 perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");
1524 printf("Channels set to %u\n", arg);
1527 status = ioctl(Mixer, SOUND_MIXER_WRITE_VOLUME, &arg);
1529 perror("SOUND_MIXER_WRITE_VOLUME ioctl failed");
1530 printf("Volume set to %u\n", arg);
1534 OMX_ERRORTYPE StopComponent(OMX_HANDLETYPE *pHandle)
1536 OMX_ERRORTYPE error = OMX_ErrorNone;
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");
1547 error = WaitForState(pHandle, OMX_StateIdle);
1550 GT_END("Call to SendCommand <OMX_StateIdle>");
1553 if(error != OMX_ErrorNone) {
1554 fprintf(stderr, "\nError: hG729Decoder->WaitForState reports an error %X!!!!!!!\n", error);
1561 OMX_ERRORTYPE PauseComponent(OMX_HANDLETYPE *pHandle)
1563 OMX_ERRORTYPE error = OMX_ErrorNone;
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");
1574 error = WaitForState(pHandle, OMX_StatePause);
1577 GT_END("Call to SendCommand <OMX_StatePause>");
1580 if(error != OMX_ErrorNone) {
1581 fprintf(stderr, "\nError: hG729Decoder->WaitForState reports an error %X!!!!!!!\n", error);
1588 OMX_ERRORTYPE PlayComponent(OMX_HANDLETYPE *pHandle)
1590 OMX_ERRORTYPE error = OMX_ErrorNone;
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");
1599 error = WaitForState(pHandle, OMX_StateExecuting);
1601 GT_END("Call to SendCommand <OMX_StateExecuting>");
1603 if(error != OMX_ErrorNone) {
1604 fprintf(stderr, "\nError: hG729Decoder->WaitForState reports an error %X!!!!!!!\n", error);
1612 OMX_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)
1623 OMX_ERRORTYPE eError = OMX_ErrorNone;
1626 printf("Free buffers\n");
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__);
1634 if(pInBufferParam[i] != NULL){
1635 free(pInBufferParam[i]);
1636 pInBufferParam[i] = NULL;
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__);
1650 free(pCompPrivateStruct);
1651 free(pCompPrivateStructMute);
1652 free(pCompPrivateStructVolume);
1654 close(IpBuf_Pipe[0]);
1655 close(IpBuf_Pipe[1]);
1656 close(OpBuf_Pipe[0]);
1657 close(OpBuf_Pipe[1]);
1666 OMX_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)
1677 OMX_ERRORTYPE eError = OMX_ErrorNone;
1680 printf("Free buffers\n");
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__);
1688 if(pInBufferParam[i] != NULL){
1689 free(pInBufferParam[i]);
1690 pInBufferParam[i] = NULL;
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__);
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]);