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