1 2 /* 3 * Copyright (C) Texas Instruments - http://www.ti.com/ 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; either 8 * version 2.1 of the License, or (at your option) any later version. 9 * 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with this library; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 /* ============================================================================= 22 * Texas Instruments OMAP (TM) Platform Software 23 * (c) Copyright Texas Instruments, Incorporated. All Rights Reserved. 24 * 25 * Use of this software is controlled by the terms and conditions found 26 * in the license agreement under which this software has been supplied. 27 * =========================================================================== */ 28 /** 29 * @file OMX_G711Dec_Utils.c 30 * 31 * This file implements OMX Component for G711 decoder that 32 * is fully compliant with the OMX Audio specification. 33 * 34 * @path $(CSLPATH)\ 35 * 36 * @rev 0.1 37 */ 38 /* ----------------------------------------------------------------------------*/ 39 40 /* ------compilation control switches -------------------------*/ 41 /**************************************************************** 42 * INCLUDE FILES 43 ****************************************************************/ 44 /* ----- system and platform files ----------------------------*/ 45 #ifdef UNDER_CE 46 #include <windows.h> 47 #include <oaf_osal.h> 48 #include <omx_core.h> 49 #include <stdlib.h> 50 #else 51 #include <unistd.h> 52 #include <sys/types.h> 53 #include <sys/types.h> 54 #include <sys/wait.h> 55 #include <sys/stat.h> 56 #include <dlfcn.h> 57 #include <malloc.h> 58 #include <memory.h> 59 #include <fcntl.h> 60 #include <errno.h> 61 #include <dlfcn.h> 62 #endif 63 #include <dbapi.h> 64 #include <string.h> 65 #include <stdio.h> 66 #include "OMX_G711Dec_Utils.h" 67 #include "g711decsocket_ti.h" 68 #include "decode_common_ti.h" 69 #include "usn.h" 70 #ifdef RESOURCE_MANAGER_ENABLED 71 #include <ResourceManagerProxyAPI.h> 72 #endif 73 74 /* ======================================================================= */ 75 /** 76 * @def DASF Defines the value for identify DASF ON 77 */ 78 /* ======================================================================= */ 79 #define DASF 1 80 81 #ifdef DASF 82 int iAudioFormat = 1; 83 int iSamplingRate = 8000; 84 #endif 85 86 #ifdef UNDER_CE 87 #define HASHINGENABLE 1 88 void sleep(DWORD Duration) 89 { 90 Sleep(Duration); 91 } 92 #endif 93 94 #ifdef G711DEC_MEMDEBUG 95 #define newmalloc(x) mymalloc(__LINE__,__FILE__,x) 96 #define newfree(z) myfree(z,__LINE__,__FILE__) 97 #else 98 #define newmalloc(x) malloc(x) 99 #define newfree(z) free(z) 100 #endif 101 102 /* ========================================================================== */ 103 /** 104 * @G711DECFill_LCMLInitParams () This function is used by the component thread to 105 * fill the all of its initialization parameters, buffer deatils etc 106 * to LCML structure, 107 * 108 * @param pComponent handle for this instance of the component 109 * @param plcml_Init pointer to LCML structure to be filled 110 * 111 * @pre 112 * 113 * @post 114 * 115 * @return none 116 */ 117 /* ========================================================================== */ 118 static G711DEC_COMPONENT_PRIVATE *pComponentPrivate_CC = NULL; 119 120 OMX_ERRORTYPE G711DECFill_LCMLInitParams(OMX_HANDLETYPE pComponent, 121 LCML_DSP *plcml_Init, OMX_U16 arr[]) 122 { 123 OMX_ERRORTYPE eError = OMX_ErrorNone; 124 OMX_U32 nIpBuf = 0,nIpBufSize = 0,nOpBuf = 0,nOpBufSize = 0; 125 OMX_U16 i = 0; 126 OMX_BUFFERHEADERTYPE *pTemp = NULL; 127 OMX_U16 size_lcml = 0; 128 LCML_STRMATTR *strmAttr = NULL; 129 130 LCML_DSP_INTERFACE *pHandle = (LCML_DSP_INTERFACE *)pComponent; 131 G711DEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 132 LCML_G711DEC_BUFHEADERTYPE *pTemp_lcml = NULL; 133 134 G711DEC_DPRINT("%d :: G711DECFill_LCMLInitParams\n ",__LINE__); 135 G711DEC_DPRINT("%d :: pHandle = %p\n",__LINE__,pHandle); 136 G711DEC_DPRINT("%d :: pHandle->pComponentPrivate = %p\n",__LINE__,pHandle->pComponentPrivate); 137 138 pComponentPrivate = pHandle->pComponentPrivate; 139 140 nIpBuf = (OMX_U16)pComponentPrivate->pInputBufferList->numBuffers; 141 nIpBufSize = pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->nBufferSize; 142 pComponentPrivate->nRuntimeInputBuffers = nIpBuf; 143 nOpBuf = pComponentPrivate->pOutputBufferList->numBuffers; 144 nOpBufSize = pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->nBufferSize; 145 146 /* Fill Input Buffers Info for LCML */ 147 plcml_Init->In_BufInfo.nBuffers = nIpBuf; 148 plcml_Init->In_BufInfo.nSize = nIpBufSize; 149 plcml_Init->In_BufInfo.DataTrMethod = DMM_METHOD; 150 151 152 /* Fill Output Buffers Info for LCML */ 153 plcml_Init->Out_BufInfo.nBuffers = nOpBuf; 154 plcml_Init->Out_BufInfo.nSize = nOpBufSize; 155 plcml_Init->Out_BufInfo.DataTrMethod = DMM_METHOD; 156 157 /*Copy the node information */ 158 plcml_Init->NodeInfo.nNumOfDLLs = 3; 159 160 plcml_Init->NodeInfo.AllUUIDs[0].uuid = &G711DECSOCKET_TI_UUID; 161 strcpy ((char*)plcml_Init->NodeInfo.AllUUIDs[0].DllName,G711DEC_DLL_NAME); 162 plcml_Init->NodeInfo.AllUUIDs[0].eDllType = DLL_NODEOBJECT; 163 164 plcml_Init->NodeInfo.AllUUIDs[1].uuid = &G711DECSOCKET_TI_UUID; 165 strcpy ((char*)plcml_Init->NodeInfo.AllUUIDs[1].DllName,G711DEC_DLL_NAME); 166 plcml_Init->NodeInfo.AllUUIDs[1].eDllType = DLL_DEPENDENT; 167 168 plcml_Init->NodeInfo.AllUUIDs[2].uuid = &USN_TI_UUID; 169 strcpy ((char*)plcml_Init->NodeInfo.AllUUIDs[2].DllName,G711DEC_USN_DLL_NAME); 170 plcml_Init->NodeInfo.AllUUIDs[2].eDllType = DLL_DEPENDENT; 171 172 173 if(pComponentPrivate->dasfmode == 1) { 174 G711DEC_DPRINT("pComponentPrivate->dasfmode = %d\n",pComponentPrivate->dasfmode); 175 G711D_OMX_MALLOC(strmAttr, LCML_STRMATTR); 176 pComponentPrivate->strmAttr = strmAttr; 177 178 strmAttr->uSegid = 0; 179 strmAttr->uAlignment = 0; 180 strmAttr->uTimeout = G711D_TIMEOUT; 181 strmAttr->uBufsize = nOpBufSize; 182 strmAttr->uNumBufs = NUM_G711DEC_OUTPUT_BUFFERS_DASF; 183 strmAttr->lMode = STRMMODE_PROCCOPY; 184 plcml_Init->DeviceInfo.TypeofDevice =1; 185 plcml_Init->DeviceInfo.TypeofRender =0; 186 187 if(pComponentPrivate->acdnmode == 1) 188 { 189 /* DASF/TeeDN mode */ 190 plcml_Init->DeviceInfo.AllUUIDs[0].uuid = &ACDN_TI_UUID; 191 } 192 else 193 { 194 /* ACDN mode */ 195 plcml_Init->DeviceInfo.AllUUIDs[0].uuid = &DCTN_TI_UUID; 196 } 197 198 plcml_Init->DeviceInfo.DspStream = strmAttr; 199 } 200 else { 201 pComponentPrivate->strmAttr = NULL; 202 } 203 204 /*copy the other information */ 205 plcml_Init->SegID = OMX_G711DEC_DEFAULT_SEGMENT; 206 plcml_Init->Timeout = OMX_G711DEC_SN_TIMEOUT; 207 plcml_Init->Alignment = 0; 208 plcml_Init->Priority = OMX_G711DEC_SN_PRIORITY; 209 plcml_Init->ProfileID = -1; 210 211 arr[0] = STREAM_COUNT; 212 arr[1] = G711DEC_INPUT_PORT; 213 arr[2] = G711DEC_DMM; 214 215 if (pComponentPrivate->pInputBufferList->numBuffers) { 216 arr[3] = (OMX_U16) (pComponentPrivate->pInputBufferList->numBuffers ); 217 } 218 else { 219 arr[3] = 1; 220 } 221 222 arr[4] = G711DEC_OUTPUT_PORT; 223 224 if(pComponentPrivate->dasfmode == 1) { 225 G711DEC_DPRINT("Setting up create phase params for DASF mode\n"); 226 arr[5] = G711DEC_OUTSTRM; 227 arr[6] = NUM_G711DEC_OUTPUT_BUFFERS_DASF; 228 } 229 else { 230 231 G711DEC_DPRINT("Setting up create phase params for FILE mode\n"); 232 233 arr[5] = G711DEC_DMM; 234 235 if (pComponentPrivate->pOutputBufferList->numBuffers) { 236 arr[6] = (OMX_U16) pComponentPrivate->pOutputBufferList->numBuffers; 237 } 238 else { 239 arr[6] = 1; 240 } 241 } 242 243 /* set companding mode (A-Law or Mu-Law) */ 244 arr[7] = (OMX_U16)pComponentPrivate->g711Params[G711DEC_INPUT_PORT]->ePCMMode; 245 arr[8] = (OMX_S16)pComponentPrivate->ftype; 246 arr[9] = pComponentPrivate->nmulevel; 247 arr[10] = pComponentPrivate->noiselp; 248 arr[11] = pComponentPrivate->dbmnoise; 249 arr[12] = pComponentPrivate->packetlostc; 250 arr[13] = END_OF_CR_PHASE_ARGS; 251 252 plcml_Init->pCrPhArgs = arr; 253 254 G711DEC_DPRINT("%d :: Comp: OMX_G711DecUtils.c\n",__LINE__); 255 256 size_lcml = (OMX_U16) (nIpBuf * sizeof(LCML_G711DEC_BUFHEADERTYPE)); 257 G711D_OMX_MALLOC_SIZE(pTemp_lcml, size_lcml, LCML_G711DEC_BUFHEADERTYPE); 258 259 pComponentPrivate->pLcmlBufHeader[G711DEC_INPUT_PORT] = pTemp_lcml; 260 261 for (i=0; i<nIpBuf; i++) { 262 pTemp = pComponentPrivate->pInputBufferList->pBufHdr[i]; 263 pTemp->nSize = sizeof(OMX_BUFFERHEADERTYPE); 264 pTemp->nAllocLen = nIpBufSize; 265 pTemp->nFilledLen = nIpBufSize; 266 pTemp->nVersion.s.nVersionMajor = G711DEC_MAJOR_VER; 267 pTemp->nVersion.s.nVersionMinor = G711DEC_MINOR_VER; 268 pTemp->pPlatformPrivate = pHandle->pComponentPrivate; 269 pTemp->nTickCount = NOT_USED; 270 pTemp_lcml->buffer = pTemp; 271 pTemp_lcml->eDir = OMX_DirInput; 272 273 G711D_OMX_MALLOC(pTemp_lcml->pIpParam, G711DEC_UAlgInBufParamStruct); 274 275 pTemp_lcml->pIpParam->usFrameLost = 0; 276 pTemp_lcml->pIpParam->usEndOfFile = 0; 277 278 G711D_OMX_MALLOC(pTemp_lcml->pBufferParam,G711DEC_ParamStruct); 279 G711D_OMX_MALLOC(pTemp_lcml->pDmmBuf,DMM_BUFFER_OBJ); 280 281 /* This means, it is not a last buffer. This flag is to be modified by 282 * the application to indicate the last buffer */ 283 pTemp->nFlags = NORMAL_BUFFER; 284 285 pTemp_lcml++; 286 } 287 288 /* Allocate memory for all output buffer headers.. 289 * This memory pointer will be sent to LCML */ 290 size_lcml = (OMX_U16) nOpBuf * sizeof(LCML_G711DEC_BUFHEADERTYPE); 291 G711D_OMX_MALLOC_SIZE(pTemp_lcml, size_lcml, LCML_G711DEC_BUFHEADERTYPE); 292 293 pComponentPrivate->pLcmlBufHeader[G711DEC_OUTPUT_PORT] = pTemp_lcml; 294 295 for (i=0; i<nOpBuf; i++) { 296 pTemp = pComponentPrivate->pOutputBufferList->pBufHdr[i]; 297 pTemp->nSize = sizeof(OMX_BUFFERHEADERTYPE); 298 pTemp->nAllocLen = nOpBufSize; 299 pTemp->nFilledLen = nOpBufSize; 300 pTemp->nVersion.s.nVersionMajor = G711DEC_MAJOR_VER; 301 pTemp->nVersion.s.nVersionMinor = G711DEC_MINOR_VER; 302 pComponentPrivate->nVersion = pTemp->nVersion.nVersion; 303 pTemp->pPlatformPrivate = pHandle->pComponentPrivate; 304 pTemp->nTickCount = NOT_USED; 305 /* This means, it is not a last buffer. This flag is to be modified by 306 * the application to indicate the last buffer */ 307 308 pTemp_lcml->buffer = pTemp; 309 pTemp_lcml->eDir = OMX_DirOutput; 310 311 G711DEC_DPRINT("%d:::pTemp_lcml = %p\n",__LINE__,pTemp_lcml); 312 G711DEC_DPRINT("%d:::pTemp_lcml->buffer = %p\n",__LINE__,pTemp_lcml->buffer); 313 314 pTemp->nFlags = NORMAL_BUFFER; 315 316 pTemp_lcml++; 317 } 318 319 pComponentPrivate->bPortDefsAllocated = 1; 320 G711DEC_DPRINT("%d :: Exiting G711DECFill_LCMLInitParams",__LINE__); 321 322 pComponentPrivate->bInitParamsInitialized = 1; 323 324 EXIT: 325 326 if(eError == OMX_ErrorInsufficientResources) 327 { 328 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->strmAttr); 329 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pLcmlBufHeader[G711DEC_INPUT_PORT]); 330 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pLcmlBufHeader[G711DEC_OUTPUT_PORT]); 331 if (pTemp_lcml != NULL) { 332 OMX_G711DECMEMFREE_STRUCT(pTemp_lcml->pIpParam); 333 } 334 } 335 336 return eError; 337 } 338 339 340 /* ========================================================================== */ 341 /** 342 * @G711DEC_StartComponentThread() This function is called by the component to create 343 * the component thread, command pipe, data pipe and LCML Pipe. 344 * 345 * @param pComponent handle for this instance of the component 346 * 347 * @pre 348 * 349 * @post 350 * 351 * @return none 352 */ 353 /* ========================================================================== */ 354 355 OMX_ERRORTYPE G711DEC_StartComponentThread(OMX_HANDLETYPE pComponent) 356 { 357 OMX_ERRORTYPE eError = OMX_ErrorNone; 358 OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent; 359 360 G711DEC_COMPONENT_PRIVATE *pComponentPrivate = 361 (G711DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 362 363 #ifdef UNDER_CE 364 pthread_attr_t attr; 365 memset(&attr, 0, sizeof(attr)); 366 attr.__inheritsched = PTHREAD_EXPLICIT_SCHED; 367 attr.__schedparam.__sched_priority = OMX_AUDIO_DECODER_THREAD_PRIORITY; 368 #endif 369 370 G711DEC_DPRINT ("%d :: Inside G711DEC_StartComponentThread\n", __LINE__); 371 372 /* Initialize all the variables*/ 373 pComponentPrivate->bIsStopping = 0; 374 pComponentPrivate->lcml_nOpBuf = 0; 375 pComponentPrivate->lcml_nIpBuf = 0; 376 pComponentPrivate->app_nBuf = 0; 377 pComponentPrivate->num_Op_Issued = 0; 378 pComponentPrivate->num_Sent_Ip_Buff = 0; 379 pComponentPrivate->num_Reclaimed_Op_Buff = 0; 380 pComponentPrivate->bIsEOFSent = 0; 381 382 /* create the pipe used to send buffers to the thread */ 383 eError = pipe (pComponentPrivate->cmdDataPipe); 384 if (eError) { 385 eError = OMX_ErrorInsufficientResources; 386 goto EXIT; 387 } 388 389 /* create the pipe used to send buffers to the thread */ 390 eError = pipe (pComponentPrivate->dataPipe); 391 if (eError) { 392 eError = OMX_ErrorInsufficientResources; 393 goto EXIT; 394 } 395 396 /* create the pipe used to send commands to the thread */ 397 eError = pipe (pComponentPrivate->cmdPipe); 398 if (eError) { 399 eError = OMX_ErrorInsufficientResources; 400 goto EXIT; 401 } 402 403 /* Create the Component Thread */ 404 #ifdef UNDER_CE 405 eError = pthread_create (&(pComponentPrivate->ComponentThread), &attr, 406 ComponentThread, pComponentPrivate); 407 #else 408 eError = pthread_create (&(pComponentPrivate->ComponentThread), NULL, 409 ComponentThread, pComponentPrivate); 410 #endif 411 412 if (eError || !pComponentPrivate->ComponentThread) { 413 eError = OMX_ErrorInsufficientResources; 414 goto EXIT; 415 } 416 417 pComponentPrivate_CC = pComponentPrivate; 418 pComponentPrivate->bCompThreadStarted = 1; 419 420 EXIT: 421 return eError; 422 } 423 424 /* ========================================================================== */ 425 /** 426 * @G711Dec_FreeCompResources() This function is called by the component during 427 * de-init to close component thread, Command pipe, data pipe & LCML pipe. 428 * 429 * @param pComponent handle for this instance of the component 430 * 431 * @pre 432 * 433 * @post 434 * 435 * @return none 436 */ 437 /* ========================================================================== */ 438 439 OMX_ERRORTYPE G711DEC_FreeCompResources(OMX_HANDLETYPE pComponent) 440 { 441 OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent; 442 443 G711DEC_COMPONENT_PRIVATE *pComponentPrivate = 444 (G711DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 445 446 OMX_ERRORTYPE eError = OMX_ErrorNone; 447 OMX_ERRORTYPE err = OMX_ErrorNone; 448 OMX_U32 nIpBuf = 0; 449 OMX_U32 nOpBuf = 0; 450 451 G711DEC_DPRINT ("%d :: G711DEC_FreeCompResources\n", __LINE__); 452 453 if (pComponentPrivate->bPortDefsAllocated) { 454 nIpBuf = pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->nBufferCountActual; 455 nOpBuf = pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->nBufferCountActual; 456 } 457 458 if (pComponentPrivate->bCompThreadStarted) { 459 err = close (pComponentPrivate->dataPipe[0]); 460 461 if (0 != err && OMX_ErrorNone == eError) { 462 eError = OMX_ErrorHardware; 463 } 464 465 err = close (pComponentPrivate->dataPipe[1]); 466 if (0 != err && OMX_ErrorNone == eError) { 467 eError = OMX_ErrorHardware; 468 } 469 470 err = close (pComponentPrivate->cmdPipe[0]); 471 if (0 != err && OMX_ErrorNone == eError) { 472 eError = OMX_ErrorHardware; 473 } 474 475 err = close (pComponentPrivate->cmdPipe[1]); 476 if (0 != err && OMX_ErrorNone == eError) { 477 eError = OMX_ErrorHardware; 478 } 479 480 err = close (pComponentPrivate->cmdDataPipe[0]); 481 if (0 != err && OMX_ErrorNone == eError) { 482 eError = OMX_ErrorHardware; 483 } 484 485 err = close (pComponentPrivate->cmdDataPipe[1]); 486 if (0 != err && OMX_ErrorNone == eError) { 487 eError = OMX_ErrorHardware; 488 } 489 490 491 } 492 493 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pHoldBuffer); 494 495 if (pComponentPrivate->bPortDefsAllocated) { 496 G711DEC_DPRINT("%d:::[G711DEC_FreeCompResources] \n", __LINE__); 497 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]); 498 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]); 499 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->g711Params[G711DEC_INPUT_PORT]); 500 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->g711Params[G711DEC_OUTPUT_PORT]); 501 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pCompPort[G711DEC_INPUT_PORT]->pPortFormat); 502 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pCompPort[G711DEC_OUTPUT_PORT]->pPortFormat); 503 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pCompPort[G711DEC_INPUT_PORT] ); 504 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pCompPort[G711DEC_OUTPUT_PORT] ); 505 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pInputBufferList); 506 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pOutputBufferList); 507 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pParams); 508 } 509 510 pComponentPrivate->bPortDefsAllocated = 0; 511 512 #ifndef UNDER_CE 513 G711DEC_DPRINT("\n\n FreeCompResources: Destroying mutexes.\n\n"); 514 pthread_mutex_destroy(&pComponentPrivate->InLoaded_mutex); 515 pthread_cond_destroy(&pComponentPrivate->InLoaded_threshold); 516 517 pthread_mutex_destroy(&pComponentPrivate->InIdle_mutex); 518 pthread_cond_destroy(&pComponentPrivate->InIdle_threshold); 519 520 pthread_mutex_destroy(&pComponentPrivate->AlloBuf_mutex); 521 pthread_cond_destroy(&pComponentPrivate->AlloBuf_threshold); 522 #else 523 OMX_DestroyEvent(&(pComponentPrivate->InLoaded_event)); 524 OMX_DestroyEvent(&(pComponentPrivate->InIdle_event)); 525 OMX_DestroyEvent(&(pComponentPrivate->AlloBuf_event)); 526 #endif 527 528 return eError; 529 } 530 /*==========================================================================================================*/ 531 /** Cleanup init params() */ 532 /*===========================================================================================================*/ 533 OMX_ERRORTYPE G711DEC_CleanupInitParams(OMX_HANDLETYPE pComponent) 534 { 535 OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent; 536 G711DEC_COMPONENT_PRIVATE *pComponentPrivate = (G711DEC_COMPONENT_PRIVATE *) 537 pHandle->pComponentPrivate; 538 539 LCML_G711DEC_BUFHEADERTYPE *pTemp_lcml = NULL; 540 OMX_U8 *pBufParmsTemp = NULL; 541 542 OMX_ERRORTYPE eError = OMX_ErrorNone; 543 OMX_U32 nIpBuf = 0; 544 OMX_U16 i=0; 545 546 G711DEC_DPRINT ("%d :: G711DEC_CleanupInitParams()\n", __LINE__); 547 548 nIpBuf = pComponentPrivate->nRuntimeInputBuffers; 549 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->strmAttr); 550 551 pTemp_lcml = pComponentPrivate->pLcmlBufHeader[G711DEC_INPUT_PORT]; 552 553 for(i=0; i<nIpBuf; i++) { 554 OMX_G711DECMEMFREE_STRUCT(pTemp_lcml->pIpParam); 555 OMX_G711DECMEMFREE_STRUCT(pTemp_lcml->pBufferParam); 556 OMX_G711DECMEMFREE_STRUCT(pTemp_lcml->pDmmBuf); 557 pBufParmsTemp = (OMX_U8*)pTemp_lcml->pFrameParam; 558 pBufParmsTemp -= 128; 559 OMX_G711DECMEMFREE_STRUCT(pBufParmsTemp); 560 pTemp_lcml++; 561 } 562 563 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pLcmlBufHeader[G711DEC_INPUT_PORT]); 564 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pLcmlBufHeader[G711DEC_OUTPUT_PORT]); 565 566 return eError; 567 } 568 569 /* ========================================================================== */ 570 /** 571 * @G711DEC_StopComponentThread() This function is called by the component during 572 * de-init to close component thread, Command pipe, data pipe & LCML pipe. 573 * 574 * @param pComponent handle for this instance of the component 575 * 576 * @pre 577 * 578 * @post 579 * 580 * @return none 581 */ 582 /* ========================================================================== */ 583 584 OMX_ERRORTYPE G711DEC_StopComponentThread(OMX_HANDLETYPE pComponent) 585 { 586 OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent; 587 G711DEC_COMPONENT_PRIVATE *pComponentPrivate = (G711DEC_COMPONENT_PRIVATE *) 588 pHandle->pComponentPrivate; 589 590 OMX_ERRORTYPE eError = OMX_ErrorNone; 591 OMX_ERRORTYPE threadError = OMX_ErrorNone; 592 OMX_S16 pthreadError = 0; 593 594 /*Join the component thread */ 595 pComponentPrivate->bIsStopping = 1; 596 pthreadError = pthread_join (pComponentPrivate->ComponentThread, 597 (void*)&threadError); 598 599 if (0 != pthreadError) { 600 eError = OMX_ErrorHardware; 601 } 602 603 /*Check for the errors */ 604 if (OMX_ErrorNone != threadError && OMX_ErrorNone != eError) { 605 eError = OMX_ErrorInsufficientResources; 606 G711DEC_DPRINT ("%d :: Error while closing Component Thread\n",__LINE__); 607 } 608 609 return eError; 610 } 611 612 613 /* ========================================================================== */ 614 /** 615 * @G711DECHandleCommand() This function is called by the component when ever it 616 * receives the command from the application 617 * 618 * @param pComponentPrivate Component private data 619 * 620 * @pre 621 * 622 * @post 623 * 624 * @return none 625 */ 626 /* ========================================================================== */ 627 628 OMX_U32 G711DECHandleCommand (G711DEC_COMPONENT_PRIVATE *pComponentPrivate) 629 { 630 631 OMX_COMPONENTTYPE *pHandle = NULL; 632 OMX_COMMANDTYPE command; 633 OMX_STATETYPE commandedState = OMX_StateInvalid; 634 OMX_U32 commandData = 0; 635 OMX_HANDLETYPE pLcmlHandle = pComponentPrivate->pLcmlHandle; 636 637 #ifdef RESOURCE_MANAGER_ENABLED 638 OMX_ERRORTYPE rm_error = OMX_ErrorNone; 639 #endif 640 641 OMX_U16 i = 0; 642 OMX_ERRORTYPE eError = OMX_ErrorNone; 643 OMX_U32 nBuf = 0; 644 OMX_U16 arr[100] = {0}; 645 char *p = "hello"; 646 647 LCML_CALLBACKTYPE cb; 648 LCML_DSP *pLcmlDsp = NULL; 649 G711DEC_AudioCodecParams *pParams = NULL; 650 OMX_S16 ret = 0; 651 LCML_G711DEC_BUFHEADERTYPE *pLcmlHdr = NULL; 652 int inputPortFlag=0,outputPortFlag=0; 653 654 pHandle = (OMX_COMPONENTTYPE *) pComponentPrivate->pHandle; 655 656 G711DEC_DPRINT ("%d :: Entering G711DECHandleCommand Function - curState = %d\n",__LINE__,pComponentPrivate->curState); 657 G711DEC_DPRINT ("%d :: pComponentPrivate = %p\n", __LINE__, pComponentPrivate); 658 G711DEC_DPRINT ("%d :: pHandle = %p\n", __LINE__, pHandle); 659 G711DEC_DPRINT ("%d :: Reading from the cmdPipe\n",__LINE__); 660 661 ret = (OMX_U16) (read (pComponentPrivate->cmdPipe[0], &command, sizeof (command))); 662 663 if (ret == -1) { 664 G711DEC_DPRINT ("%d :: Error While reading from the Pipe\n",__LINE__); 665 eError = OMX_ErrorHardware; 666 goto EXIT; 667 } 668 669 G711DEC_DPRINT ("%d :: Reading from the cmdDataPipe\n",__LINE__); 670 671 ret = (OMX_U16) (read (pComponentPrivate->cmdDataPipe[0], &commandData, sizeof (commandData))); 672 673 if (ret == -1) { 674 G711DEC_DPRINT ("%d :: Error While reading from the Pipe\n",__LINE__); 675 eError = OMX_ErrorHardware; 676 goto EXIT; 677 } 678 679 if (command == OMX_CommandStateSet) { 680 commandedState = (OMX_STATETYPE)commandData; 681 switch(commandedState) { 682 case OMX_StateIdle: 683 684 G711DEC_DPRINT("%d :: G711DEC_HandleCommand :: OMX_StateIdle \n",__LINE__); 685 G711DEC_DPRINT("%d :: pComponentPrivate->curState = %d\n",__LINE__,pComponentPrivate->curState); 686 687 if (pComponentPrivate->curState == commandedState){ 688 pComponentPrivate->cbInfo.EventHandler (pHandle, 689 pHandle->pApplicationPrivate, 690 OMX_EventError, 691 OMX_ErrorSameState, 692 0, NULL); 693 } 694 else if (pComponentPrivate->curState == OMX_StateLoaded || 695 pComponentPrivate->curState == OMX_StateWaitForResources) { 696 697 if (pComponentPrivate->dasfmode == 1) 698 { 699 pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bEnabled= FALSE; 700 pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bPopulated= FALSE; 701 702 if(pComponentPrivate->streamID == 0) 703 { 704 G711DEC_DPRINT("**************************************\n"); 705 G711DEC_DPRINT(":: Error = OMX_ErrorInsufficientResources\n"); 706 G711DEC_DPRINT("**************************************\n"); 707 708 eError = OMX_ErrorInsufficientResources; 709 pComponentPrivate->curState = OMX_StateInvalid; 710 711 pComponentPrivate->cbInfo.EventHandler( 712 pHandle, pHandle->pApplicationPrivate, 713 OMX_EventError, OMX_ErrorInvalidState,0, NULL); 714 715 goto EXIT; 716 } 717 } 718 719 if (pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->bPopulated && 720 pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->bEnabled) 721 { 722 inputPortFlag = 1; 723 } 724 725 if (!pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->bPopulated && 726 !pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->bEnabled) 727 { 728 inputPortFlag = 1; 729 } 730 731 if (pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bPopulated && 732 pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bEnabled) 733 { 734 outputPortFlag = 1; 735 } 736 737 if (!pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bPopulated && 738 !pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bEnabled) 739 { 740 outputPortFlag = 1; 741 } 742 743 if(!(inputPortFlag && outputPortFlag)) 744 { 745 /* From Loaded to Idle. All enable ports are populated. */ 746 pComponentPrivate->InLoaded_readytoidle = 1; 747 #ifndef UNDER_CE 748 pthread_mutex_lock(&pComponentPrivate->InLoaded_mutex); 749 pthread_cond_wait(&pComponentPrivate->InLoaded_threshold, 750 &pComponentPrivate->InLoaded_mutex); 751 pthread_mutex_unlock(&pComponentPrivate->InLoaded_mutex); 752 #else 753 Sleep(0); 754 #endif 755 } 756 757 G711DEC_DPRINT ("%d :: Inside G711DECHandleCommand\n",__LINE__); 758 cb.LCML_Callback = (void *) G711DECLCML_Callback; 759 pLcmlHandle = (OMX_HANDLETYPE) G711DECGetLCMLHandle(); 760 G711DEC_DPRINT ("%d :: Inside G711DECHandleCommand\n",__LINE__); 761 762 if (pLcmlHandle == NULL) { 763 G711DEC_DPRINT("%d :: LCML Handle is NULL........exiting..\n",__LINE__); 764 goto EXIT; 765 } 766 767 G711DEC_DPRINT("G711DECHandleCommand %d\n",__LINE__); 768 G711DEC_DPRINT("pLcmlHandle = %p\n",pLcmlHandle); 769 770 /* Got handle of dsp via phandle filling information about DSP specific things */ 771 pLcmlDsp = (((LCML_DSP_INTERFACE*)pLcmlHandle)->dspCodec); 772 G711DEC_DPRINT("pLcmlDsp = %p\n",pLcmlDsp); 773 774 G711DEC_DPRINT("G711DECHandleCommand %d\n",__LINE__); 775 eError = G711DECFill_LCMLInitParams(pHandle, pLcmlDsp, arr); 776 777 if(eError != OMX_ErrorNone) { 778 G711DEC_DPRINT("%d :: Error returned from\ 779 G711DECFill_LCMLInitParams()\n",__LINE__); 780 goto EXIT; 781 } 782 783 G711DEC_DPRINT("%d :: Comp: OMX_G711DecUtils.c\n",__LINE__); 784 pComponentPrivate->pLcmlHandle = (LCML_DSP_INTERFACE *)pLcmlHandle; 785 786 /*filling create phase params */ 787 cb.LCML_Callback = (void *) G711DECLCML_Callback; 788 G711DEC_DPRINT("%d :: Calling LCML_InitMMCodec...\n",__LINE__); 789 790 eError = LCML_InitMMCodecEx(((LCML_DSP_INTERFACE *)pLcmlHandle)->pCodecinterfacehandle, 791 p,&pLcmlHandle,(void *)p,&cb,(OMX_STRING)pComponentPrivate->sDeviceString); 792 793 if(eError != OMX_ErrorNone) { 794 G711DEC_DPRINT("%d :: Error returned from\ 795 LCML_Init()\n",__LINE__); 796 goto EXIT; 797 } 798 799 #ifdef RESOURCE_MANAGER_ENABLED 800 /* need check the resource with RM */ 801 G711DEC_DPRINT("%d :: G711DEC: About to call RMProxy_SendCommand\n", __LINE__); 802 803 pComponentPrivate->rmproxyCallback.RMPROXY_Callback = 804 (void *) G711DEC_ResourceManagerCallback; 805 806 if (pComponentPrivate->curState != OMX_StateWaitForResources){ 807 rm_error = RMProxy_NewSendCommand(pHandle, RMProxy_RequestResource, 808 OMX_PCM_Decoder_COMPONENT, 809 OMX_G711DEC_CPU, 810 1234, &(pComponentPrivate->rmproxyCallback)); 811 812 G711DEC_DPRINT("%d :: G711DEC: Returned from RMProxy_SendCommand\n", __LINE__); 813 G711DEC_DPRINT("%d :: G711DEC: RMProxy_SendCommand returned %d\n", __LINE__,rm_error); 814 815 if(rm_error == OMX_ErrorNone) { 816 /* resource is available */ 817 G711DEC_DPRINT("Setting to OMX_StateIdle - Line %d\n",__LINE__); 818 819 pComponentPrivate->curState = OMX_StateIdle; 820 pComponentPrivate->cbInfo.EventHandler( pHandle, 821 pHandle->pApplicationPrivate, 822 OMX_EventCmdComplete, 823 OMX_CommandStateSet, 824 pComponentPrivate->curState, 825 NULL); 826 827 rm_error = RMProxy_NewSendCommand(pHandle, 828 RMProxy_StateSet, 829 OMX_G711_Decoder_COMPONENT, 830 OMX_StateIdle, 1234, NULL); 831 } 832 } 833 else if(rm_error == OMX_ErrorInsufficientResources) { 834 /* resource is not available, need set state to OMX_StateWaitForResources */ 835 pComponentPrivate->curState = OMX_StateWaitForResources; 836 pComponentPrivate->cbInfo.EventHandler(pHandle, 837 pHandle->pApplicationPrivate, 838 OMX_EventCmdComplete, 839 OMX_CommandStateSet, 840 pComponentPrivate->curState, 841 NULL); 842 G711DEC_DPRINT("%d :: G711DEC: Error - insufficient resources\n", __LINE__); 843 } 844 #else 845 G711DEC_DPRINT("Setting to OMX_StateIdle - Line %d\n",__LINE__); 846 pComponentPrivate->curState = OMX_StateIdle; 847 pComponentPrivate->cbInfo.EventHandler( pHandle, 848 pHandle->pApplicationPrivate, 849 OMX_EventCmdComplete, 850 OMX_CommandStateSet, 851 pComponentPrivate->curState, 852 NULL); 853 #endif 854 if(pComponentPrivate->dasfmode == 1) { 855 OMX_U32 pValues[4]; 856 G711DEC_DPRINT("%d :: ---- Comp: DASF Functionality is ON ---\n",__LINE__); 857 G711D_OMX_MALLOC(pParams, G711DEC_AudioCodecParams); 858 859 pComponentPrivate->pParams = pParams; 860 pParams->iAudioFormat = iAudioFormat; 861 pParams->iSamplingRate = iSamplingRate; 862 863 pParams->iStrmId = pComponentPrivate->streamID; 864 865 pValues[0] = USN_STRMCMD_SETCODECPARAMS; 866 pValues[1] = (OMX_U32)pParams; 867 pValues[2] = sizeof(G711DEC_AudioCodecParams); 868 869 eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle, 870 EMMCodecControlStrmCtrl,(void *)pValues); 871 872 if(eError != OMX_ErrorNone) { 873 G711DEC_DPRINT("%d: Error Occurred in Codec StreamControl..\n",__LINE__); 874 goto EXIT; 875 } 876 } 877 } 878 else if (pComponentPrivate->curState == OMX_StateExecuting) { 879 char *pArgs = "damedesuStr"; 880 881 #ifdef HASHINGENABLE 882 /*Hashing Change*/ 883 pLcmlHandle = (LCML_DSP_INTERFACE*)pComponentPrivate->pLcmlHandle; 884 eError = LCML_FlushHashes(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle); 885 if (eError != OMX_ErrorNone) { 886 G711DEC_DPRINT("Error occurred in Codec mapping flush!\n"); 887 break; 888 } 889 #endif 890 /*Set the bIsStopping bit */ 891 G711DEC_DPRINT("%d :: G711DEC: About to set bIsStopping bit\n", __LINE__); 892 G711DEC_DPRINT("About to call LCML_ControlCodec(STOP)\n"); 893 894 eError = LCML_ControlCodec( 895 ((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle, 896 MMCodecControlStop,(void *)pArgs); 897 898 if(eError != OMX_ErrorNone) { 899 G711DEC_DPRINT("%d: Error Occurred in Codec Stop..\n", __LINE__); 900 goto EXIT; 901 } 902 903 pComponentPrivate->bStopSent=1; 904 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pHoldBuffer); 905 pComponentPrivate->nHoldLength = 0; 906 } 907 908 else if(pComponentPrivate->curState == OMX_StatePause) { 909 #ifdef HASHINGENABLE 910 /*Hashing Change*/ 911 pLcmlHandle = (LCML_DSP_INTERFACE*)pComponentPrivate->pLcmlHandle; 912 eError = LCML_FlushHashes(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle); 913 if (eError != OMX_ErrorNone) { 914 G711DEC_DPRINT("Error occurred in Codec mapping flush!\n"); 915 break; 916 } 917 #endif 918 G711DEC_DPRINT("%d :: Comp: Stop Command Received\n",__LINE__); 919 G711DEC_DPRINT("Setting to OMX_StateIdle - Line %d\n",__LINE__); 920 pComponentPrivate->curState = OMX_StateIdle; 921 #ifdef RESOURCE_MANAGER_ENABLED 922 rm_error = RMProxy_NewSendCommand(pHandle, 923 RMProxy_StateSet, 924 OMX_G711_Decoder_COMPONENT, 925 OMX_StateIdle, 1234, NULL); 926 #endif 927 G711DEC_DPRINT ("%d :: The component is stopped\n",__LINE__); 928 pComponentPrivate->cbInfo.EventHandler(pHandle,pHandle->pApplicationPrivate, 929 OMX_EventCmdComplete, 930 OMX_CommandStateSet, 931 pComponentPrivate->curState, 932 NULL); 933 } 934 else { 935 /* This means, it is invalid state from application */ 936 G711DEC_DPRINT("%d :: Comp: OMX_G711DecUtils.c\n",__LINE__); 937 pComponentPrivate->cbInfo.EventHandler(pHandle, 938 pHandle->pApplicationPrivate, 939 OMX_EventError, 940 OMX_ErrorIncorrectStateTransition, 941 0, NULL); 942 } 943 break; 944 945 case OMX_StateExecuting: 946 G711DEC_DPRINT("%d: G711DECHandleCommand: Cmd Executing \n",__LINE__); 947 if (pComponentPrivate->curState == commandedState){ 948 pComponentPrivate->cbInfo.EventHandler (pHandle, 949 pHandle->pApplicationPrivate, 950 OMX_EventError, 951 OMX_ErrorSameState, 952 0, NULL); 953 G711DEC_DPRINT("%d :: Error: Same State Given by Application\n",__LINE__); 954 goto EXIT; 955 } 956 else if (pComponentPrivate->curState == OMX_StateIdle) { 957 G711DEC_DPRINT("%d :: Comp: OMX_G711DecUtils.c\n",__LINE__); 958 /* Sending commands to DSP via LCML_ControlCodec third argument is not used for time being */ 959 pComponentPrivate->nFillBufferDoneCount = 0; 960 pComponentPrivate->bStopSent=0; 961 962 eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle, 963 EMMCodecControlStart, (void *)p); 964 965 if(eError != OMX_ErrorNone) { 966 G711DEC_DPRINT("%d: Error Occurred in Codec Start..\n",__LINE__); 967 goto EXIT; 968 } 969 /* Send input buffers to application */ 970 nBuf = pComponentPrivate->pInputBufferList->numBuffers; 971 G711DEC_DPRINT ("nBuf = %d\n",(int)nBuf); 972 /* Send output buffers to codec */ 973 } 974 else if (pComponentPrivate->curState == OMX_StatePause) { 975 G711DEC_DPRINT("%d :: Comp: OMX_G711DecUtils.c\n",__LINE__); 976 eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle, 977 EMMCodecControlStart, (void *)p); 978 if (eError != OMX_ErrorNone) { 979 G711DEC_DPRINT ("Error While Resuming the codec\n"); 980 goto EXIT; 981 } 982 983 for (i=0; i < pComponentPrivate->nNumInputBufPending; i++) { 984 if (pComponentPrivate->pInputBufHdrPending[i]) { 985 G711DECGetCorresponding_LCMLHeader(pComponentPrivate->pInputBufHdrPending[i]->pBuffer, OMX_DirInput, &pLcmlHdr); 986 G711DEC_SetPending(pComponentPrivate,pComponentPrivate->pInputBufHdrPending[i],OMX_DirInput); 987 988 eError = LCML_QueueBuffer(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle, 989 EMMCodecInputBuffer, 990 pComponentPrivate->pInputBufHdrPending[i]->pBuffer, 991 pComponentPrivate->pInputBufHdrPending[i]->nAllocLen, 992 pComponentPrivate->pInputBufHdrPending[i]->nFilledLen, 993 (OMX_U8 *) pLcmlHdr->pIpParam, 994 sizeof(G711DEC_UAlgInBufParamStruct), 995 NULL); 996 } 997 } 998 pComponentPrivate->nNumInputBufPending = 0; 999 1000 G711DEC_DPRINT("%d :: pComponentPrivate->nNumOutputBufPending %d\n", __LINE__,(int)pComponentPrivate->nNumOutputBufPending); 1001 for (i=0; i < pComponentPrivate->nNumOutputBufPending; i++) { 1002 if (pComponentPrivate->pOutputBufHdrPending[i]) { 1003 G711DECGetCorresponding_LCMLHeader(pComponentPrivate->pOutputBufHdrPending[i]->pBuffer, OMX_DirOutput, &pLcmlHdr); 1004 G711DEC_SetPending(pComponentPrivate,pComponentPrivate->pOutputBufHdrPending[i],OMX_DirOutput); 1005 eError = LCML_QueueBuffer(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle, 1006 EMMCodecOuputBuffer, 1007 pComponentPrivate->pOutputBufHdrPending[i]->pBuffer, 1008 pComponentPrivate->pOutputBufHdrPending[i]->nAllocLen, 1009 pComponentPrivate->pOutputBufHdrPending[i]->nFilledLen, 1010 NULL, 0, NULL); 1011 G711DEC_DPRINT("%d :: eError LCML_QueueBuffer 0x%x\n",__LINE__,eError); 1012 } 1013 1014 } 1015 pComponentPrivate->nNumOutputBufPending = 0; 1016 } 1017 else { 1018 G711DEC_DPRINT("%d :: Comp: OMX_G711DecUtils.c\n",__LINE__); 1019 pComponentPrivate->cbInfo.EventHandler (pHandle, 1020 pHandle->pApplicationPrivate, 1021 OMX_EventError, 1022 OMX_ErrorIncorrectStateTransition, 1023 0, NULL); 1024 G711DEC_DPRINT("%d :: Error: Invalid State Given by \ 1025 Application\n",__LINE__); 1026 goto EXIT; 1027 } 1028 1029 #ifdef RESOURCE_MANAGER_ENABLED 1030 rm_error = RMProxy_NewSendCommand(pHandle, RMProxy_StateSet, 1031 OMX_G711_Decoder_COMPONENT, 1032 OMX_StateExecuting, 1234, NULL); 1033 #endif 1034 /*Send state change notificaiton to Application */ 1035 pComponentPrivate->curState = OMX_StateExecuting; 1036 pComponentPrivate->cbInfo.EventHandler(pHandle, 1037 pHandle->pApplicationPrivate, 1038 OMX_EventCmdComplete, 1039 OMX_CommandStateSet, 1040 pComponentPrivate->curState, NULL); 1041 break; 1042 1043 case OMX_StateLoaded: 1044 G711DEC_DPRINT("%d: G711DECHandleCommand: Cmd Loaded - curState = %d\n",__LINE__,pComponentPrivate->curState); 1045 if (pComponentPrivate->curState == commandedState){ 1046 pComponentPrivate->cbInfo.EventHandler (pHandle, 1047 pHandle->pApplicationPrivate, 1048 OMX_EventError, 1049 OMX_ErrorSameState, 1050 0, NULL); 1051 G711DEC_DPRINT("%d :: Error: Same State Given by Application\n",__LINE__); 1052 break; 1053 } 1054 G711DEC_DPRINT("%d: pComponentPrivate->pInputBufferList->numBuffers = %d\n",__LINE__,(int)pComponentPrivate->pInputBufferList->numBuffers); 1055 G711DEC_DPRINT("%d: pComponentPrivate->pOutputBufferList->numBuffers = %d\n",__LINE__,(int)pComponentPrivate->pOutputBufferList->numBuffers); 1056 1057 if (pComponentPrivate->curState == OMX_StateWaitForResources){ 1058 G711DEC_DPRINT("%d: G711DECHandleCommand: Cmd Loaded\n",__LINE__); 1059 pComponentPrivate->curState = OMX_StateLoaded; 1060 1061 pComponentPrivate->cbInfo.EventHandler (pHandle, 1062 pHandle->pApplicationPrivate, 1063 OMX_EventCmdComplete, 1064 OMX_CommandStateSet, 1065 pComponentPrivate->curState,NULL); 1066 break; 1067 } 1068 1069 G711DEC_DPRINT("%d :: In side OMX_StateLoaded State: \n",__LINE__); 1070 1071 if (pComponentPrivate->curState != OMX_StateIdle && 1072 pComponentPrivate->curState != OMX_StateWaitForResources) { 1073 G711DEC_DPRINT("%d :: Comp: OMX_G711DecUtils.c\n",__LINE__); 1074 pComponentPrivate->cbInfo.EventHandler (pHandle, 1075 pHandle->pApplicationPrivate, 1076 OMX_EventError, 1077 OMX_ErrorIncorrectStateTransition, 1078 0, NULL); 1079 G711DEC_DPRINT("%d :: Error: Invalid State Given by \ 1080 Application\n",__LINE__); 1081 goto EXIT; 1082 } 1083 1084 G711DEC_DPRINT("pComponentPrivate->pInputBufferList->numBuffers = %d\n", 1085 (int)pComponentPrivate->pInputBufferList->numBuffers); 1086 G711DEC_DPRINT("pComponentPrivate->pOutputBufferList->numBuffers = %d\n", 1087 (int)pComponentPrivate->pOutputBufferList->numBuffers); 1088 1089 if (pComponentPrivate->pInputBufferList->numBuffers && 1090 pComponentPrivate->pOutputBufferList->numBuffers) { 1091 pComponentPrivate->InIdle_goingtoloaded = 1; 1092 #ifndef UNDER_CE 1093 pthread_mutex_lock(&pComponentPrivate->InIdle_mutex); 1094 pthread_cond_wait(&pComponentPrivate->InIdle_threshold, 1095 &pComponentPrivate->InIdle_mutex); 1096 pthread_mutex_unlock(&pComponentPrivate->InIdle_mutex); 1097 #else 1098 OMX_WaitForEvent(&(pComponentPrivate->InIdle_event)); 1099 #endif 1100 } 1101 1102 /* Now Deinitialize the component No error should be returned from 1103 * this function. It should clean the system as much as possible */ 1104 G711DEC_DPRINT("%d :: In side OMX_StateLoaded State: \n",__LINE__); 1105 eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle, 1106 EMMCodecControlDestroy, (void *)p); 1107 1108 G711DEC_DPRINT("%d :: In side OMX_StateLoaded State: \n",__LINE__); 1109 if (eError != OMX_ErrorNone) { 1110 G711DEC_DPRINT("%d : Error: in Destroying the codec: no. %x\n",__LINE__, eError); 1111 goto EXIT; 1112 } 1113 1114 G711DEC_DPRINT("%d: G711DECHandleCommand: Cmd Loaded\n",__LINE__); 1115 eError = EXIT_COMPONENT_THRD; 1116 pComponentPrivate->bInitParamsInitialized = 0; 1117 pComponentPrivate->bLoadedCommandPending = OMX_FALSE; 1118 /* Send StateChangeNotification to application */ 1119 break; 1120 1121 case OMX_StatePause: 1122 G711DEC_DPRINT("%d: G711DECHandleCommand: Cmd Pause\n",__LINE__); 1123 if (pComponentPrivate->curState == commandedState){ 1124 pComponentPrivate->cbInfo.EventHandler (pHandle, 1125 pHandle->pApplicationPrivate, 1126 OMX_EventError, 1127 OMX_ErrorSameState, 0, NULL); 1128 1129 G711DEC_DPRINT("%d :: Error: Same State Given by \ 1130 Application\n",__LINE__); 1131 break; 1132 } 1133 if (pComponentPrivate->curState != OMX_StateExecuting && 1134 pComponentPrivate->curState != OMX_StateIdle) { 1135 G711DEC_DPRINT("%d :: Comp: OMX_G711DecUtils.c\n",__LINE__); 1136 pComponentPrivate->cbInfo.EventHandler (pHandle, 1137 pHandle->pApplicationPrivate, 1138 OMX_EventError, 1139 OMX_ErrorIncorrectStateTransition, 1140 0, NULL); 1141 G711DEC_DPRINT("%d :: Error: Invalid State Given by \ 1142 Application\n",__LINE__); 1143 goto EXIT; 1144 } 1145 eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle, 1146 EMMCodecControlPause, (void *)p); 1147 1148 if (eError != OMX_ErrorNone) { 1149 G711DEC_DPRINT("%d : Error: in Pausing the codec\n",__LINE__); 1150 goto EXIT; 1151 } 1152 break; 1153 1154 case OMX_StateWaitForResources: 1155 1156 if (pComponentPrivate->curState == commandedState){ 1157 G711DEC_DPRINT("%d :: Comp: OMX_G711DecUtils.c\n",__LINE__); 1158 pComponentPrivate->cbInfo.EventHandler (pHandle, 1159 pHandle->pApplicationPrivate, 1160 OMX_EventError, 1161 OMX_ErrorSameState, 1162 0, NULL); 1163 1164 G711DEC_DPRINT("%d :: Error: Same State Given by \ 1165 Application\n",__LINE__); 1166 } 1167 else if (pComponentPrivate->curState == OMX_StateLoaded) { 1168 G711DEC_DPRINT("%d :: Comp: OMX_G711DecUtils.c\n",__LINE__); 1169 pComponentPrivate->curState = OMX_StateWaitForResources; 1170 pComponentPrivate->cbInfo.EventHandler(pHandle, 1171 pHandle->pApplicationPrivate, 1172 OMX_EventCmdComplete, 1173 OMX_CommandStateSet, 1174 pComponentPrivate->curState,NULL); 1175 } 1176 else{ 1177 G711DEC_DPRINT("%d :: Comp: OMX_G711DecUtils.c\n",__LINE__); 1178 pComponentPrivate->cbInfo.EventHandler(pHandle, 1179 pHandle->pApplicationPrivate, 1180 OMX_EventError, 1181 OMX_ErrorIncorrectStateTransition, 1182 0, "NULL"); 1183 } 1184 break; 1185 1186 case OMX_StateInvalid: 1187 G711DEC_DPRINT("%d: G711DECHandleCommand: Cmd OMX_StateInvalid:\n",__LINE__); 1188 if (pComponentPrivate->curState == commandedState){ 1189 pComponentPrivate->cbInfo.EventHandler (pHandle, 1190 pHandle->pApplicationPrivate, 1191 OMX_EventError, 1192 OMX_ErrorSameState, 1193 0, NULL); 1194 G711DEC_DPRINT("%d :: Error: Same State Given by \ 1195 Application\n",__LINE__); 1196 } 1197 else{ 1198 G711DEC_DPRINT("%d :: Comp: OMX_G711DecUtils.c\n",__LINE__); 1199 if (pComponentPrivate->curState != OMX_StateWaitForResources && 1200 pComponentPrivate->curState != OMX_StateLoaded) { 1201 eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle, 1202 EMMCodecControlDestroy, (void *)p); 1203 } 1204 1205 pComponentPrivate->curState = OMX_StateInvalid; 1206 pComponentPrivate->cbInfo.EventHandler(pHandle, 1207 pHandle->pApplicationPrivate, 1208 OMX_EventError, 1209 OMX_ErrorInvalidState, 1210 0, NULL); 1211 G711DEC_CleanupInitParams(pHandle); 1212 } 1213 break; 1214 1215 case OMX_StateMax: 1216 G711DEC_DPRINT("%d: G711DECHandleCommand: Cmd OMX_StateMax::\n",__LINE__); 1217 break; 1218 } /* End of Switch */ 1219 } 1220 else if (command == OMX_CommandMarkBuffer) { 1221 G711DEC_DPRINT("command OMX_CommandMarkBuffer received %d\n",__LINE__); 1222 if(!pComponentPrivate->pMarkBuf){ 1223 G711DEC_DPRINT("command OMX_CommandMarkBuffer received %d\n",__LINE__); 1224 pComponentPrivate->pMarkBuf = (OMX_MARKTYPE *)(commandData); 1225 } 1226 } 1227 else if (command == OMX_CommandPortDisable) { 1228 if (!pComponentPrivate->bDisableCommandPending) { 1229 if(commandData == 0x0 || commandData == -1){ 1230 /* disable port */ 1231 pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->bEnabled = OMX_FALSE; 1232 } 1233 1234 if(commandData == 0x1 || commandData == -1){ 1235 char *pArgs = "damedesuStr"; 1236 pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bEnabled = OMX_FALSE; 1237 1238 if (pComponentPrivate->curState == OMX_StateExecuting) { 1239 pComponentPrivate->bNoIdleOnStop = OMX_TRUE; 1240 G711DEC_DPRINT("Calling LCML_ControlCodec() Line %d\n",__LINE__); 1241 eError = LCML_ControlCodec( 1242 ((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle, 1243 MMCodecControlStop,(void *)pArgs); 1244 } 1245 } 1246 } 1247 1248 if(commandData == 0x0) { 1249 if(!pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->bPopulated){ 1250 /* return cmdcomplete event if input unpopulated */ 1251 pComponentPrivate->cbInfo.EventHandler(pHandle, 1252 pHandle->pApplicationPrivate, 1253 OMX_EventCmdComplete, 1254 OMX_CommandPortDisable, 1255 G711DEC_INPUT_PORT, NULL); 1256 G711DEC_DPRINT("Clearing bDisableCommandPending Line %d\n",__LINE__); 1257 pComponentPrivate->bDisableCommandPending = 0; 1258 } 1259 else{ 1260 pComponentPrivate->bDisableCommandPending = 1; 1261 pComponentPrivate->bDisableCommandParam = commandData; 1262 } 1263 } 1264 1265 if(commandData == 0x1) { 1266 if (!pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bPopulated){ 1267 /* return cmdcomplete event if output unpopulated */ 1268 pComponentPrivate->cbInfo.EventHandler(pHandle, 1269 pHandle->pApplicationPrivate, 1270 OMX_EventCmdComplete, 1271 OMX_CommandPortDisable, 1272 G711DEC_OUTPUT_PORT, NULL); 1273 1274 G711DEC_DPRINT("Clearing bDisableCommandPending Line %d\n",__LINE__); 1275 pComponentPrivate->bDisableCommandPending = 0; 1276 } 1277 else { 1278 pComponentPrivate->bDisableCommandPending = 1; 1279 pComponentPrivate->bDisableCommandParam = commandData; 1280 } 1281 } 1282 1283 if(commandData == -1) { 1284 if (!pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->bPopulated && 1285 !pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bPopulated){ 1286 1287 /* return cmdcomplete event if inout & output unpopulated */ 1288 pComponentPrivate->cbInfo.EventHandler(pHandle, 1289 pHandle->pApplicationPrivate, 1290 OMX_EventCmdComplete, 1291 OMX_CommandPortDisable, 1292 G711DEC_INPUT_PORT, NULL); 1293 1294 pComponentPrivate->cbInfo.EventHandler(pHandle, 1295 pHandle->pApplicationPrivate, 1296 OMX_EventCmdComplete, 1297 OMX_CommandPortDisable, 1298 G711DEC_OUTPUT_PORT, NULL); 1299 1300 G711DEC_DPRINT("Clearing bDisableCommandPending Line %d\n",__LINE__); 1301 pComponentPrivate->bDisableCommandPending = 0; 1302 } 1303 else { 1304 pComponentPrivate->bDisableCommandPending = 1; 1305 pComponentPrivate->bDisableCommandParam = commandData; 1306 } 1307 } 1308 } 1309 else if (command == OMX_CommandPortEnable) { 1310 if(!pComponentPrivate->bEnableCommandPending) { 1311 if(commandData == 0x0 || commandData == -1){ 1312 /* enable in port */ 1313 G711DEC_DPRINT ("setting input port to enabled\n"); 1314 1315 G711DEC_DPRINT ("pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->bEnabled = %d\n",pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->bEnabled); 1316 if(pComponentPrivate->AlloBuf_waitingsignal) 1317 { 1318 G711DEC_DPRINT ("%d :: Unblock AlloBuf_threshold\n", __LINE__); 1319 pComponentPrivate->AlloBuf_waitingsignal = 0; 1320 } 1321 pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->bEnabled = OMX_TRUE; 1322 /* Removing sleep calls. */ 1323 G711DEC_DPRINT ("pComponentPrivate->pPortDef[INPUT_PORT]->bEnabled = %d\n", 1324 pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->bEnabled); 1325 } 1326 if(commandData == 0x1 || commandData == -1){ 1327 /* Removing sleep() calls. */ 1328 if(pComponentPrivate->AlloBuf_waitingsignal) 1329 { 1330 G711DEC_DPRINT ("%d :: Unblock AlloBuf_threshold", __LINE__); 1331 pComponentPrivate->AlloBuf_waitingsignal = 0; 1332 #ifndef UNDER_CE 1333 pthread_mutex_lock(&pComponentPrivate->AlloBuf_mutex); 1334 pthread_cond_signal(&pComponentPrivate->AlloBuf_threshold); 1335 pthread_mutex_unlock(&pComponentPrivate->AlloBuf_mutex); 1336 #else 1337 OMX_SignalEvent(&(pComponentPrivate->AlloBuf_event)); 1338 #endif 1339 } 1340 1341 /* Removing sleep() calls. */ 1342 /* enable out port */ 1343 if (pComponentPrivate->curState == OMX_StateExecuting) 1344 { 1345 char *pArgs = "damedesuStr"; 1346 pComponentPrivate->bDspStoppedWhileExecuting = OMX_FALSE; 1347 eError = LCML_ControlCodec( 1348 ((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle, 1349 EMMCodecControlStart,(void *)pArgs); 1350 } 1351 G711DEC_DPRINT("setting output port to enabled\n"); 1352 pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bEnabled = OMX_TRUE; 1353 G711DEC_DPRINT("pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bEnabled = %d\n",pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bEnabled); 1354 } 1355 } 1356 if(commandData == 0x0) 1357 { 1358 if (pComponentPrivate->curState == OMX_StateLoaded || 1359 pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->bPopulated) 1360 { 1361 pComponentPrivate->cbInfo.EventHandler( pHandle, 1362 pHandle->pApplicationPrivate, 1363 OMX_EventCmdComplete, 1364 OMX_CommandPortEnable, 1365 G711DEC_INPUT_PORT, 1366 NULL); 1367 pComponentPrivate->bEnableCommandPending = 0; 1368 } 1369 else { 1370 pComponentPrivate->bEnableCommandPending = 1; 1371 pComponentPrivate->bEnableCommandParam = commandData; 1372 } 1373 } 1374 else if(commandData == 0x1){ 1375 if (pComponentPrivate->curState == OMX_StateLoaded || 1376 pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bPopulated){ 1377 pComponentPrivate->cbInfo.EventHandler( pHandle, 1378 pHandle->pApplicationPrivate, 1379 OMX_EventCmdComplete, 1380 OMX_CommandPortEnable, 1381 G711DEC_OUTPUT_PORT, 1382 NULL); 1383 pComponentPrivate->bEnableCommandPending = 0; 1384 } 1385 else { 1386 pComponentPrivate->bEnableCommandPending = 1; 1387 pComponentPrivate->bEnableCommandParam = commandData; 1388 } 1389 } 1390 else if(commandData == -1 ){ 1391 if (pComponentPrivate->curState == OMX_StateLoaded || 1392 (pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->bPopulated 1393 && pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->bPopulated)){ 1394 pComponentPrivate->cbInfo.EventHandler( pHandle, 1395 pHandle->pApplicationPrivate, 1396 OMX_EventCmdComplete, 1397 OMX_CommandPortEnable, 1398 G711DEC_INPUT_PORT, 1399 NULL); 1400 1401 pComponentPrivate->cbInfo.EventHandler( pHandle, 1402 pHandle->pApplicationPrivate, 1403 OMX_EventCmdComplete, 1404 OMX_CommandPortEnable, 1405 G711DEC_OUTPUT_PORT, 1406 NULL); 1407 pComponentPrivate->bEnableCommandPending = 0; 1408 G711DECFill_LCMLInitParamsEx(pComponentPrivate->pHandle); 1409 pComponentPrivate->bJustReenabled = 1; 1410 } 1411 else { 1412 pComponentPrivate->bEnableCommandPending = 1; 1413 pComponentPrivate->bEnableCommandParam = commandData; 1414 } 1415 } 1416 #ifndef UNDER_CE 1417 pthread_mutex_lock(&pComponentPrivate->AlloBuf_mutex); 1418 pthread_cond_signal(&pComponentPrivate->AlloBuf_threshold); 1419 pthread_mutex_unlock(&pComponentPrivate->AlloBuf_mutex); 1420 #else 1421 OMX_SignalEvent(&(pComponentPrivate->AlloBuf_event)); 1422 #endif 1423 } 1424 else if (command == OMX_CommandFlush) { 1425 if(commandData == 0x0 || commandData == -1){ 1426 for (i=0; i < MAX_NUM_OF_BUFS; i++) 1427 { 1428 pComponentPrivate->pInputBufHdrPending[i] = NULL; 1429 } 1430 for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) 1431 { 1432 G711DEC_DPRINT("line %d:: Calling EmptyBufferDone\n",__LINE__); 1433 pComponentPrivate->cbInfo.EmptyBufferDone ( 1434 pComponentPrivate->pHandle, 1435 pComponentPrivate->pHandle->pApplicationPrivate, 1436 pComponentPrivate->pInputBufferList->pBufHdr[i] 1437 ); 1438 pComponentPrivate->nEmptyBufferDoneCount++; 1439 pComponentPrivate->nNumInputBufPending = 0; 1440 } 1441 1442 /* return all input buffers */ 1443 pComponentPrivate->cbInfo.EventHandler(pHandle, 1444 pHandle->pApplicationPrivate, 1445 OMX_EventCmdComplete, 1446 OMX_CommandFlush, 1447 G711DEC_INPUT_PORT, NULL); 1448 } 1449 if(commandData == 0x1 || commandData == -1){ 1450 for (i=0; i < MAX_NUM_OF_BUFS; i++) 1451 { 1452 pComponentPrivate->pOutputBufHdrPending[i] = NULL; 1453 } 1454 /* return all output buffers */ 1455 for (i=0; i < pComponentPrivate->pOutputBufferList->numBuffers; i++) { 1456 G711DEC_DPRINT("Calling FillBufferDone From Line %d\n",__LINE__); 1457 pComponentPrivate->cbInfo.FillBufferDone ( 1458 pComponentPrivate->pHandle, 1459 pComponentPrivate->pHandle->pApplicationPrivate, 1460 pComponentPrivate->pOutputBufferList->pBufHdr[i] 1461 ); 1462 pComponentPrivate->nFillBufferDoneCount++; 1463 pComponentPrivate->nNumOutputBufPending = 0; 1464 } 1465 1466 pComponentPrivate->cbInfo.EventHandler(pHandle, 1467 pHandle->pApplicationPrivate, 1468 OMX_EventCmdComplete, 1469 OMX_CommandFlush, 1470 G711DEC_OUTPUT_PORT, NULL); 1471 } 1472 } 1473 1474 EXIT: 1475 G711DEC_DPRINT ("%d :: Exiting G711DECHandleCommand Function\n",__LINE__); 1476 G711DEC_DPRINT ("%d :: Returning %d\n",__LINE__,eError); 1477 return eError; 1478 } 1479 1480 1481 /* ========================================================================== */ 1482 /** 1483 * @G711DECHandleDataBuf_FromApp() This function is called by the component when ever it 1484 * receives the buffer from the application 1485 * 1486 * @param pComponentPrivate Component private data 1487 * @param pBufHeader Buffer from the application 1488 * 1489 * @pre 1490 * 1491 * @post 1492 * 1493 * @return none 1494 */ 1495 /* ========================================================================== */ 1496 OMX_ERRORTYPE G711DECHandleDataBuf_FromApp(OMX_BUFFERHEADERTYPE* pBufHeader, 1497 G711DEC_COMPONENT_PRIVATE *pComponentPrivate) 1498 { 1499 OMX_ERRORTYPE eError = OMX_ErrorNone; 1500 OMX_DIRTYPE eDir; 1501 LCML_G711DEC_BUFHEADERTYPE *pLcmlHdr = NULL; 1502 LCML_DSP_INTERFACE *pLcmlHandle = (LCML_DSP_INTERFACE *) 1503 pComponentPrivate->pLcmlHandle; 1504 OMX_U32 frameLength = 0; 1505 OMX_U8* pExtraData = NULL; 1506 OMX_U32 holdBufferSize = 0; 1507 1508 OMX_U8 nFrames = 0; 1509 OMX_U8 *frameType = NULL; 1510 LCML_DSP_INTERFACE * phandle = NULL; 1511 OMX_U8 *pBufParmsTemp = NULL; 1512 1513 G711DEC_DPRINT ("%d :: Entering G711DECHandleDataBuf_FromApp Function\n",__LINE__); 1514 1515 holdBufferSize = (pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->nBufferSize) * 1516 (pComponentPrivate->pInputBufferList->numBuffers + 1); 1517 /*Find the direction of the received buffer from buffer list */ 1518 eError = G711DECGetBufferDirection(pBufHeader, &eDir); 1519 if (eError != OMX_ErrorNone) { 1520 G711DEC_DPRINT ("%d :: The PBufHeader is not found in the list\n", 1521 __LINE__); 1522 goto EXIT; 1523 } 1524 1525 if (eDir == OMX_DirInput) { 1526 1527 if ( pBufHeader->nFilledLen > 0 ) { 1528 pComponentPrivate->bBypassDSP = 0; 1529 1530 if ( pComponentPrivate->nHoldLength == 0 ) { 1531 1532 G711DEC_DPRINT("G711DECHandleDataBuf_FromApp - reading G711DEC\n"); 1533 frameLength = pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->nBufferSize; 1534 1535 if ( pBufHeader->nFilledLen >= frameLength ) { 1536 1537 /* Copy the aFillBufferPtr from the 2nd frame to iHoldBuffer*/ 1538 /* The 1st frame will stay in aFillBufferPtr to be passed down.*/ 1539 /* the length of remaining Frames in aFillBufferPtr.*/ 1540 pComponentPrivate->nHoldLength = pBufHeader->nFilledLen - frameLength; 1541 1542 if ( pComponentPrivate->nHoldLength > 0 ) {/* something need to be hold in iHoldBuffer */ 1543 if (pComponentPrivate->pHoldBuffer == NULL) { 1544 G711D_OMX_MALLOC_SIZE(pComponentPrivate->pHoldBuffer, holdBufferSize, OMX_U8); 1545 } 1546 1547 /* Copy the extra data into pHoldBuffer. Size will be nHoldLength. */ 1548 pExtraData = pBufHeader->pBuffer + (pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->nBufferSize); 1549 memcpy (pComponentPrivate->pHoldBuffer, pExtraData, pComponentPrivate->nHoldLength); 1550 } 1551 } 1552 else { 1553 /* received buffer with less than 1 G711 frame. Save the data in iHoldBuffer.*/ 1554 pComponentPrivate->nHoldLength = pBufHeader->nFilledLen; 1555 1556 /* save the data into iHoldBuffer.*/ 1557 if (pComponentPrivate->pHoldBuffer == NULL) { 1558 G711D_OMX_MALLOC_SIZE(pComponentPrivate->pHoldBuffer, holdBufferSize, OMX_U8); 1559 } 1560 /* Not enough data to be sent. Copy all received data into iHoldBuffer.*/ 1561 /* Size to be copied will be iHoldLen == mmData->BufferSize() */ 1562 memcpy (pComponentPrivate->pHoldBuffer, 1563 pBufHeader->pBuffer, pComponentPrivate->nHoldLength); 1564 1565 /* since not enough data, we shouldn't send anything to SN, but instead request to EmptyBufferDone again.*/ 1566 G711DEC_DPRINT("line %d:: Calling EmptyBufferDone\n",__LINE__); 1567 if (pComponentPrivate->curState != OMX_StatePause) { 1568 pComponentPrivate->cbInfo.EmptyBufferDone ( 1569 pComponentPrivate->pHandle, 1570 pComponentPrivate->pHandle->pApplicationPrivate, 1571 pBufHeader); 1572 pComponentPrivate->nEmptyBufferDoneCount++; 1573 } 1574 else { 1575 pComponentPrivate->pInputBufHdrPending[pComponentPrivate->nNumInputBufPending++] = pBufHeader; 1576 } 1577 1578 1579 goto EXIT; 1580 } 1581 } 1582 else { 1583 /* iHoldBuffer has data. There is no possibility that data in iHoldBuffer is less for 1 frame without*/ 1584 /* lastBufferFlag being set. Unless it's a corrupt file.*/ 1585 /* Copy the data in dataPtr to iHoldBuffer. Update the iHoldBuffer size (iHoldLen).*/ 1586 1587 1588 pExtraData = pComponentPrivate->pHoldBuffer + pComponentPrivate->nHoldLength; 1589 memcpy(pExtraData,pBufHeader->pBuffer,pBufHeader->nFilledLen); 1590 1591 pComponentPrivate->nHoldLength += pBufHeader->nFilledLen; 1592 1593 frameLength = (pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->nBufferSize); 1594 1595 if ( pComponentPrivate->nHoldLength >= frameLength ) { 1596 /* Copy the data from pComponentPrivate->pHoldBuffer to pBufHeader->pBuffer*/ 1597 memcpy(pBufHeader->pBuffer,pComponentPrivate->pHoldBuffer,frameLength); 1598 1599 /* Now the pHoldBuffer has framelength fewer bytes - update nHoldLength*/ 1600 pComponentPrivate->nHoldLength = pComponentPrivate->nHoldLength - frameLength; 1601 1602 /* Shift the remaining bytes to the beginning of the pHoldBuffer */ 1603 pExtraData = pComponentPrivate->pHoldBuffer + frameLength; 1604 if (frameLength >= pComponentPrivate->nHoldLength) 1605 memcpy(pComponentPrivate->pHoldBuffer,pExtraData, pComponentPrivate->nHoldLength); 1606 else 1607 memmove(pComponentPrivate->pHoldBuffer,pExtraData, pComponentPrivate->nHoldLength); 1608 1609 1610 /* Clear the rest of the data from the pHoldBuffer */ 1611 pExtraData = pComponentPrivate->pHoldBuffer + pComponentPrivate->nHoldLength; 1612 memset(pExtraData,0,holdBufferSize - pComponentPrivate->nHoldLength); 1613 } 1614 else { 1615 if (pComponentPrivate->curState != OMX_StatePause) { 1616 G711DEC_DPRINT("line %d:: Calling EmptyBufferDone\n",__LINE__); 1617 pComponentPrivate->cbInfo.EmptyBufferDone ( 1618 pComponentPrivate->pHandle, 1619 pComponentPrivate->pHandle->pApplicationPrivate, 1620 pBufHeader); 1621 pComponentPrivate->nEmptyBufferDoneCount++; 1622 goto EXIT; 1623 } 1624 else { 1625 pComponentPrivate->pInputBufHdrPending[pComponentPrivate->nNumInputBufPending++] = pBufHeader; 1626 } 1627 } 1628 } 1629 1630 eError = G711DECGetCorresponding_LCMLHeader(pBufHeader->pBuffer, OMX_DirInput, &pLcmlHdr); 1631 if (eError != OMX_ErrorNone) { 1632 G711DEC_DPRINT("%d :: Error: Invalid Buffer Came ...\n",__LINE__); 1633 goto EXIT; 1634 } 1635 phandle = (LCML_DSP_INTERFACE *)( 1636 ((LCML_CODEC_INTERFACE *)pLcmlHandle->pCodecinterfacehandle)->pCodec); 1637 1638 nFrames = (OMX_U8)(pBufHeader->nFilledLen / RTP_Framesize); 1639 frameType = pBufHeader->pBuffer; 1640 frameType += RTP_Framesize - 1; 1641 1642 if( (pLcmlHdr->pBufferParam->usNbFrames < nFrames) && 1643 (pLcmlHdr->pFrameParam != NULL)){ 1644 OMX_DmmUnMap(phandle->dspCodec->hProc, 1645 (void*)pLcmlHdr->pBufferParam->pParamElem, 1646 pLcmlHdr->pDmmBuf->pReserved); 1647 1648 pLcmlHdr->pBufferParam->pParamElem = NULL; 1649 1650 pBufParmsTemp = (OMX_U8*)pLcmlHdr->pFrameParam; 1651 pBufParmsTemp -= 128; 1652 newfree(pBufParmsTemp); 1653 pLcmlHdr->pFrameParam = NULL; 1654 } 1655 1656 if(pLcmlHdr->pFrameParam == NULL ){ 1657 G711D_OMX_MALLOC_SIZE(pBufParmsTemp, 1658 ((sizeof(G711DEC_FrameStruct)*nFrames) + 256), 1659 OMX_U8); 1660 1661 pLcmlHdr->pFrameParam = (G711DEC_FrameStruct*)(pBufParmsTemp + 128); 1662 eError = OMX_DmmMap(phandle->dspCodec->hProc, 1663 nFrames*sizeof(G711DEC_FrameStruct), 1664 (void*)pLcmlHdr->pFrameParam, (pLcmlHdr->pDmmBuf)); 1665 1666 if (eError != OMX_ErrorNone){ 1667 G711DEC_PRINT("OMX_DmmMap ERRROR!!!!\n\n"); 1668 goto EXIT; 1669 } 1670 pLcmlHdr->pBufferParam->pParamElem = 1671 (G711DEC_FrameStruct *)pLcmlHdr->pDmmBuf->pMapped; 1672 } 1673 1674 if(pBufHeader->nFlags == OMX_BUFFERFLAG_EOS) { 1675 (pLcmlHdr->pFrameParam+(nFrames-1))->usLastFrame = OMX_BUFFERFLAG_EOS; 1676 pComponentPrivate->bPlayCompleteFlag = 1; 1677 pBufHeader->nFlags = 0; 1678 } 1679 1680 pLcmlHdr->pBufferParam->usNbFrames = nFrames; 1681 1682 /*Store tick count information*/ 1683 pComponentPrivate->arrBufIndexTick[pComponentPrivate->IpBufindex] = pBufHeader->nTickCount; 1684 1685 /* Store time stamp information */ 1686 pComponentPrivate->arrBufIndex[pComponentPrivate->IpBufindex] = pBufHeader->nTimeStamp; 1687 pComponentPrivate->IpBufindex++; 1688 pComponentPrivate->IpBufindex %= pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->nBufferCountActual; 1689 if (pComponentPrivate->curState == OMX_StateExecuting) { 1690 if (!G711DEC_IsPending(pComponentPrivate,pBufHeader,OMX_DirInput)) { 1691 G711DEC_SetPending(pComponentPrivate,pBufHeader,OMX_DirInput); 1692 1693 eError = LCML_QueueBuffer(pLcmlHandle->pCodecinterfacehandle, 1694 EMMCodecInputBuffer, 1695 (OMX_U8 *)pBufHeader->pBuffer, 1696 STD_G711DEC_BUF_SIZE*nFrames, 1697 STD_G711DEC_BUF_SIZE*nFrames, 1698 (OMX_U8 *) pLcmlHdr->pBufferParam, 1699 sizeof(G711DEC_ParamStruct), 1700 NULL); 1701 1702 if (eError != OMX_ErrorNone) { 1703 eError = OMX_ErrorHardware; 1704 goto EXIT; 1705 } 1706 pComponentPrivate->lcml_nCntIp++; 1707 pComponentPrivate->lcml_nIpBuf++; 1708 pComponentPrivate->num_Sent_Ip_Buff++; 1709 } 1710 } 1711 else if (pComponentPrivate->curState == OMX_StatePause){ 1712 pComponentPrivate->pInputBufHdrPending[pComponentPrivate->nNumInputBufPending++] = pBufHeader; 1713 } 1714 1715 } 1716 else { 1717 pComponentPrivate->bBypassDSP = 1; 1718 if (pComponentPrivate->dasfmode == 0 && pBufHeader->nFlags != OMX_BUFFERFLAG_EOS) { 1719 G711DEC_DPRINT("line %d:: Calling EmptyBufferDone\n",__LINE__); 1720 pComponentPrivate->cbInfo.EmptyBufferDone ( 1721 pComponentPrivate->pHandle, 1722 pComponentPrivate->pHandle->pApplicationPrivate, 1723 pComponentPrivate->pInputBufferList->pBufHdr[0] 1724 ); 1725 pComponentPrivate->nEmptyBufferDoneCount++; 1726 } 1727 } 1728 if(pBufHeader->nFlags == OMX_BUFFERFLAG_EOS) 1729 { 1730 if(pComponentPrivate->dasfmode == 0 && pBufHeader->nFilledLen == 0) 1731 { 1732 pComponentPrivate->pOutputBufferList->pBufHdr[0]->nFlags |= OMX_BUFFERFLAG_EOS; 1733 } 1734 1735 pComponentPrivate->bIsEOFSent = 0; 1736 if(pComponentPrivate->dasfmode == 0) { 1737 pComponentPrivate->pOutputBufferList->pBufHdr[0]->nFlags |= OMX_BUFFERFLAG_EOS; 1738 pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle, 1739 pComponentPrivate->pHandle->pApplicationPrivate, 1740 OMX_EventBufferFlag, 1741 pComponentPrivate->pOutputBufferList->pBufHdr[0]->nOutputPortIndex, 1742 pComponentPrivate->pOutputBufferList->pBufHdr[0]->nFlags, NULL); 1743 1744 pComponentPrivate->cbInfo.FillBufferDone (pComponentPrivate->pHandle, 1745 pComponentPrivate->pHandle->pApplicationPrivate, 1746 pComponentPrivate->pOutputBufferList->pBufHdr[0]); 1747 1748 pComponentPrivate->cbInfo.EmptyBufferDone (pComponentPrivate->pHandle, 1749 pComponentPrivate->pHandle->pApplicationPrivate, 1750 pComponentPrivate->pInputBufferList->pBufHdr[0]); 1751 G711DEC_DPRINT ("%d :: Flags has been propagated from input to output port\n",__LINE__); 1752 } 1753 pBufHeader->nFlags = 0; 1754 1755 } 1756 if(pBufHeader->pMarkData){ 1757 /* copy mark to output buffer header */ 1758 pComponentPrivate->pOutputBufferList->pBufHdr[0]->pMarkData = pBufHeader->pMarkData; 1759 pComponentPrivate->pOutputBufferList->pBufHdr[0]->hMarkTargetComponent = pBufHeader->hMarkTargetComponent; 1760 1761 /* trigger event handler if we are supposed to */ 1762 if(pBufHeader->hMarkTargetComponent == pComponentPrivate->pHandle && pBufHeader->pMarkData){ 1763 pComponentPrivate_CC->cbInfo.EventHandler(pComponentPrivate->pHandle, 1764 pComponentPrivate->pHandle->pApplicationPrivate, 1765 OMX_EventMark, 0, 0, pBufHeader->pMarkData); 1766 } 1767 } 1768 } 1769 else if (eDir == OMX_DirOutput) { 1770 /* Make sure that output buffer is issued to output stream only when 1771 * there is an outstanding input buffer already issued on input stream 1772 */ 1773 if (!(pComponentPrivate->bIsStopping)) { 1774 if (pComponentPrivate->bBypassDSP == 0) { 1775 G711DEC_DPRINT ("%d: Sending Empty OUTPUT BUFFER to Codec = %p\n",__LINE__,pBufHeader->pBuffer); 1776 1777 if (pComponentPrivate->curState == OMX_StateExecuting) { 1778 if (!G711DEC_IsPending(pComponentPrivate,pBufHeader,OMX_DirOutput)) { 1779 G711DEC_SetPending(pComponentPrivate,pBufHeader,OMX_DirOutput); 1780 1781 1782 eError = LCML_QueueBuffer(pLcmlHandle->pCodecinterfacehandle, 1783 EMMCodecOuputBuffer, 1784 (OMX_U8 *)pBufHeader->pBuffer, 1785 (pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->nBufferSize), 1786 (pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->nBufferSize), 1787 NULL, 0, NULL); 1788 1789 G711DEC_DPRINT("%d :: LCML_QueueBuffer eError 0x%x\n",__LINE__, eError); 1790 if (eError != OMX_ErrorNone ) { 1791 G711DEC_DPRINT ("%d :: IssuingDSP OP: Error Occurred\n",__LINE__); 1792 eError = OMX_ErrorHardware; 1793 goto EXIT; 1794 } 1795 pComponentPrivate->lcml_nOpBuf++; 1796 pComponentPrivate->num_Op_Issued++; 1797 } 1798 } 1799 else if (pComponentPrivate->curState == OMX_StatePause){ 1800 pComponentPrivate->pOutputBufHdrPending[pComponentPrivate->nNumOutputBufPending++] = pBufHeader; 1801 G711DEC_DPRINT("%d :: pComponentPrivate->nNumOutputBufPending 0x%x\n",__LINE__,(int)pComponentPrivate->nNumOutputBufPending); 1802 } 1803 } 1804 1805 else { 1806 pComponentPrivate->cbInfo.FillBufferDone (pComponentPrivate->pHandle, 1807 pComponentPrivate->pHandle->pApplicationPrivate, 1808 pComponentPrivate->pOutputBufferList->pBufHdr[0]); 1809 } 1810 } 1811 else { 1812 if (pComponentPrivate->curState == OMX_StateExecuting) { 1813 if (!G711DEC_IsPending(pComponentPrivate,pBufHeader,OMX_DirOutput)) { 1814 1815 G711DEC_SetPending(pComponentPrivate,pBufHeader,OMX_DirOutput); 1816 eError = LCML_QueueBuffer(pLcmlHandle->pCodecinterfacehandle, 1817 EMMCodecOuputBuffer, (OMX_U8 *)pBufHeader->pBuffer, 1818 (pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->nBufferSize), 1819 (pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->nBufferSize), 1820 NULL, 0, NULL); 1821 1822 if (eError != OMX_ErrorNone ) { 1823 G711DEC_DPRINT ("%d :: IssuingDSP OP: Error Occurred\n",__LINE__); 1824 eError = OMX_ErrorHardware; 1825 goto EXIT; 1826 } 1827 pComponentPrivate->lcml_nOpBuf++; 1828 pComponentPrivate->num_Op_Issued++; 1829 } 1830 } 1831 else if (pComponentPrivate->curState == OMX_StatePause){ 1832 pComponentPrivate->pOutputBufHdrPending[pComponentPrivate->nNumOutputBufPending++] = pBufHeader; 1833 G711DEC_DPRINT("%d :: pComponentPrivate->nNumOutputBufPending 0x%x\n",__LINE__,(int)pComponentPrivate->nNumOutputBufPending); 1834 } 1835 } 1836 } 1837 else { 1838 eError = OMX_ErrorBadParameter; 1839 } 1840 1841 EXIT: 1842 G711DEC_DPRINT("%d : Exiting from G711DECHandleDataBuf_FromApp \n",__LINE__); 1843 G711DEC_DPRINT("Returning error %d\n",eError); 1844 return eError; 1845 } 1846 1847 /*-------------------------------------------------------------------*/ 1848 /** 1849 * G711DECGetBufferDirection () This function is used by the component thread to 1850 * request a buffer from the application. Since it was called from 2 places, 1851 * it made sense to turn this into a small function. 1852 * 1853 * @param pData pointer to G711 Decoder Context Structure 1854 * @param pCur pointer to the buffer to be requested to be filled 1855 * 1856 * @retval none 1857 **/ 1858 /*-------------------------------------------------------------------*/ 1859 1860 OMX_ERRORTYPE G711DECGetBufferDirection(OMX_BUFFERHEADERTYPE *pBufHeader, 1861 OMX_DIRTYPE *eDir) 1862 { 1863 OMX_ERRORTYPE eError = OMX_ErrorNone; 1864 G711DEC_COMPONENT_PRIVATE *pComponentPrivate = pBufHeader->pPlatformPrivate; 1865 OMX_U32 nBuf = 0; 1866 OMX_BUFFERHEADERTYPE *pBuf = NULL; 1867 OMX_S16 flag = 1; 1868 OMX_U16 i = 0; 1869 1870 G711DEC_DPRINT ("%d :: Entering G711DECGetBufferDirection Function\n",__LINE__); 1871 1872 /*Search this buffer in input buffers list */ 1873 nBuf = pComponentPrivate->pInputBufferList->numBuffers; 1874 1875 for(i=0; i<nBuf; i++) { 1876 pBuf = pComponentPrivate->pInputBufferList->pBufHdr[i]; 1877 if(pBufHeader == pBuf) { 1878 *eDir = OMX_DirInput; 1879 G711DEC_DPRINT ("%d :: Buffer %p is INPUT BUFFER\n",__LINE__, pBufHeader); 1880 flag = 0; 1881 goto EXIT; 1882 } 1883 } 1884 1885 /*Search this buffer in input buffers list */ 1886 nBuf = pComponentPrivate->pOutputBufferList->numBuffers; 1887 1888 for(i=0; i<nBuf; i++) { 1889 pBuf = pComponentPrivate->pOutputBufferList->pBufHdr[i]; 1890 if(pBufHeader == pBuf) { 1891 *eDir = OMX_DirOutput; 1892 G711DEC_DPRINT ("%d :: Buffer %p is OUTPUT BUFFER\n",__LINE__, pBufHeader); 1893 flag = 0; 1894 goto EXIT; 1895 } 1896 } 1897 1898 if (flag == 1) { 1899 G711DEC_DPRINT ("%d :: Buffer %p is Not Found in the List\n",__LINE__,pBufHeader); 1900 eError = OMX_ErrorUndefined; 1901 goto EXIT; 1902 } 1903 EXIT: 1904 G711DEC_DPRINT ("%d :: Exiting G711DECGetBufferDirection Function\n",__LINE__); 1905 return eError; 1906 } 1907 1908 /*-------------------------------------------------------------------*/ 1909 /** 1910 * G711DECHandleDataBuf_FromLCML () This function is used by the component thread to 1911 * request a buffer from the application. Since it was called from 2 places, 1912 * it made sense to turn this into a small function. 1913 * 1914 * @param pData pointer to G711 Decoder Context Structure 1915 * @param pCur pointer to the buffer to be requested to be filled 1916 * 1917 * @retval none 1918 **/ 1919 /*-------------------------------------------------------------------*/ 1920 OMX_ERRORTYPE G711DECHandleDataBuf_FromLCML(G711DEC_COMPONENT_PRIVATE* pComponentPrivate, 1921 LCML_G711DEC_BUFHEADERTYPE* msgBuffer) 1922 { 1923 OMX_ERRORTYPE eError = OMX_ErrorNone; 1924 OMX_U32 checkBeforeFilling = 0; 1925 OMX_U32 inputBufferSize = 0, frameLength = 0; 1926 LCML_DSP_INTERFACE *pLcmlHandle = (LCML_DSP_INTERFACE *) 1927 pComponentPrivate->pLcmlHandle; 1928 LCML_G711DEC_BUFHEADERTYPE *pLcmlHdr = NULL; 1929 OMX_U16 i = 0; 1930 1931 OMX_COMPONENTTYPE* pHandle = (OMX_COMPONENTTYPE*)pComponentPrivate->pHandle; 1932 1933 G711DEC_DPRINT ("%d :: Entering G711DECHandleDataBuf_FromLCML Function\n",__LINE__); 1934 1935 if (!(pComponentPrivate->bIsStopping)) { 1936 if (msgBuffer->eDir == G711DEC_DIRECTION_INPUT) { 1937 G711DEC_DPRINT("%d: Component Sending Empty Input buffer%p to App\n", 1938 __LINE__,msgBuffer->buffer); 1939 inputBufferSize = (pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->nBufferSize); 1940 1941 if ( pComponentPrivate->pInputBufferList->numBuffers == 1 ) { 1942 checkBeforeFilling = inputBufferSize; 1943 } 1944 else { 1945 checkBeforeFilling = inputBufferSize * (pComponentPrivate->pInputBufferList->numBuffers - 1); 1946 } 1947 1948 if (pComponentPrivate->nHoldLength < checkBeforeFilling) { 1949 G711DEC_DPRINT("line %d:: Calling EmptyBufferDone\n",__LINE__); 1950 G711DEC_DPRINT("pComponentPrivate->nHoldLength = %d\n",(int)pComponentPrivate->nHoldLength); 1951 G711DEC_DPRINT("checkBeforeFilling = %d\n",(int)checkBeforeFilling); 1952 1953 pComponentPrivate->cbInfo.EmptyBufferDone (pHandle, 1954 pHandle->pApplicationPrivate, 1955 msgBuffer->buffer); 1956 1957 pComponentPrivate->nEmptyBufferDoneCount++; 1958 pComponentPrivate->lcml_nIpBuf--; 1959 pComponentPrivate->app_nBuf++; 1960 } 1961 1962 /* 1963 * We possibly have enough data in iHoldBuffer. 1964 * If we don't have enough data to be send, then we need to refill when last buffer is not set 1965 * even though FillThisHwBuffer has already been sent. 1966 * Send QueueBuffer from iHoldBuffer then reflushed the iHoldBuffer. 1967 */ 1968 else { 1969 if ( pComponentPrivate->nHoldLength > 0 ) { 1970 1971 frameLength = (pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->nBufferSize); 1972 1973 if ( pComponentPrivate->nHoldLength >= frameLength ) { 1974 /* Copy the data from iHoldBuffer to dataPtr */ 1975 if ((msgBuffer->buffer->pBuffer == NULL) || 1976 (pComponentPrivate->pHoldBuffer == NULL)) { 1977 eError = OMX_ErrorBadParameter; 1978 goto EXIT; 1979 } 1980 1981 memcpy(msgBuffer->buffer->pBuffer, 1982 pComponentPrivate->pHoldBuffer, 1983 frameLength); 1984 1985 memcpy(pComponentPrivate->pHoldBuffer, 1986 pComponentPrivate->pHoldBuffer + frameLength, 1987 pComponentPrivate->nHoldLength - frameLength); 1988 1989 pComponentPrivate->nHoldLength = pComponentPrivate->nHoldLength - frameLength; 1990 eError = G711DECGetCorresponding_LCMLHeader(msgBuffer->buffer->pBuffer, OMX_DirInput, &pLcmlHdr); 1991 1992 1993 for (i=0; i < inputBufferSize; i++) { 1994 G711DEC_DPRINT("%d::Queueing msgBuffer->buffer->pBuffer[%d] = %x\n",__LINE__,i,msgBuffer->buffer->pBuffer[i]); 1995 } 1996 G711DEC_SetPending(pComponentPrivate,msgBuffer->buffer,OMX_DirInput); 1997 eError = LCML_QueueBuffer(pLcmlHandle->pCodecinterfacehandle, 1998 EMMCodecInputBuffer, 1999 (OMX_U8 *)msgBuffer->buffer->pBuffer, 2000 inputBufferSize, 2001 frameLength,(OMX_U8 *) pLcmlHdr->pIpParam, 2002 sizeof(G711DEC_UAlgInBufParamStruct), 2003 NULL); 2004 } 2005 else { 2006 /*We need to refill more since iHoldBuffer only has partial data.*/ 2007 2008 G711DEC_DPRINT("line %d:: Calling EmptyBufferDone\n",__LINE__); 2009 2010 if (pComponentPrivate->curState != OMX_StatePause) { 2011 pComponentPrivate->cbInfo.EmptyBufferDone ( 2012 pHandle, 2013 pHandle->pApplicationPrivate, 2014 msgBuffer->buffer); 2015 pComponentPrivate->nEmptyBufferDoneCount++; 2016 } 2017 else { 2018 pComponentPrivate->pInputBufHdrPending[pComponentPrivate->nNumInputBufPending++] = msgBuffer->buffer; 2019 } 2020 2021 } 2022 } 2023 } 2024 } 2025 else if (msgBuffer->eDir == G711DEC_DIRECTION_OUTPUT) { 2026 pComponentPrivate->num_Reclaimed_Op_Buff++; 2027 2028 if (pComponentPrivate->bIsEOFSent) { 2029 msgBuffer->buffer->nFlags |= OMX_BUFFERFLAG_EOS; 2030 pComponentPrivate->bIsEOFSent = 0; 2031 } 2032 2033 /*Copying tick count information to output buffer*/ 2034 msgBuffer->buffer->nTickCount = (OMX_U32)pComponentPrivate->arrBufIndexTick[pComponentPrivate->OpBufindex]; 2035 2036 /* Copying time stamp information to output buffer */ 2037 msgBuffer->buffer->nTimeStamp = (OMX_TICKS)pComponentPrivate->arrBufIndex[pComponentPrivate->OpBufindex]; 2038 pComponentPrivate->OpBufindex++; 2039 pComponentPrivate->OpBufindex %= pComponentPrivate->pPortDef[OMX_DirInput]->nBufferCountActual; 2040 2041 G711DEC_DPRINT("Calling FillBufferDone From Line %d, buffer %p\n",__LINE__, msgBuffer->buffer); 2042 G711DEC_DPRINT("%d :: Output buff %p, TimeStamp %lld\n",__LINE__, msgBuffer->buffer, msgBuffer->buffer->nTimeStamp); 2043 pComponentPrivate->cbInfo.FillBufferDone ( pHandle, 2044 pHandle->pApplicationPrivate, 2045 msgBuffer->buffer); 2046 pComponentPrivate->lcml_nOpBuf--; 2047 pComponentPrivate->app_nBuf++; 2048 pComponentPrivate->nFillBufferDoneCount++; 2049 pComponentPrivate->nOutStandingFillDones--; 2050 2051 G711DEC_DPRINT("%d:Incrementing app_nBuf = %d\n",__LINE__,(int)pComponentPrivate->app_nBuf); 2052 } 2053 else { 2054 eError = OMX_ErrorBadParameter; 2055 goto EXIT; 2056 } 2057 } 2058 else { 2059 2060 if (msgBuffer->eDir == G711DEC_DIRECTION_INPUT) { 2061 pComponentPrivate->lcml_nIpBuf--; 2062 G711DEC_DPRINT("line %d:: Calling EmptyBufferDone\n",__LINE__); 2063 pComponentPrivate->cbInfo.EmptyBufferDone (pHandle, 2064 pHandle->pApplicationPrivate, 2065 msgBuffer->buffer); 2066 pComponentPrivate->app_nBuf++; 2067 pComponentPrivate->nEmptyBufferDoneCount++; 2068 } 2069 else if (msgBuffer->eDir == G711DEC_DIRECTION_OUTPUT) { 2070 pComponentPrivate->lcml_nOpBuf--; 2071 pComponentPrivate->num_Reclaimed_Op_Buff++; 2072 G711DEC_DPRINT("%d: Component Sending Filled Output buffer%p to App\n",__LINE__,msgBuffer->buffer); 2073 G711DEC_DPRINT ("Sending Filled OUTPUT BUFFER to App = %p\n",msgBuffer->buffer->pBuffer); 2074 2075 if (pComponentPrivate->bIsEOFSent) { 2076 msgBuffer->buffer->nFlags |= OMX_BUFFERFLAG_EOS; 2077 pComponentPrivate->bIsEOFSent = 0; 2078 } 2079 G711DEC_DPRINT("Calling FillBufferDone From Line %d\n",__LINE__); 2080 2081 pComponentPrivate->cbInfo.FillBufferDone (pHandle, 2082 pHandle->pApplicationPrivate, 2083 msgBuffer->buffer); 2084 pComponentPrivate->app_nBuf++; 2085 pComponentPrivate->nFillBufferDoneCount++; 2086 pComponentPrivate->nOutStandingFillDones--; 2087 2088 2089 G711DEC_DPRINT("%d:Incrementing app_nBuf = %d\n",__LINE__,(int)pComponentPrivate->app_nBuf); 2090 } 2091 } 2092 EXIT: 2093 G711DEC_DPRINT ("%d :: Exiting G711DECHandleDataBuf_FromLCML Function\n",__LINE__); 2094 return eError; 2095 } 2096 2097 /* -------------------------------------------------------------------*/ 2098 /** 2099 * Callback() function will be called LCML component to write the msg 2100 * 2101 * @param msgBuffer This buffer will be returned by the LCML 2102 * 2103 * @retval OMX_NoError Success, ready to roll 2104 * OMX_Error_BadParameter The input parameter pointer is null 2105 **/ 2106 /*-------------------------------------------------------------------*/ 2107 /* gLcmlPipeWr = pComponentPrivate->lcml_Pipe[1];*/ 2108 2109 OMX_ERRORTYPE G711DECLCML_Callback (TUsnCodecEvent event,void * args [10]) 2110 { 2111 OMX_ERRORTYPE eError = OMX_ErrorNone; 2112 OMX_U8 *pBuffer = args[1]; 2113 LCML_G711DEC_BUFHEADERTYPE *pLcmlHdr = NULL; 2114 OMX_S16 ret = 0; 2115 2116 #ifdef G711DEC_DEBUG 2117 LCML_DSP_INTERFACE *phandle = (LCML_DSP_INTERFACE *)args[6]; 2118 #endif 2119 2120 G711DEC_DPRINT ("%d :: Entering the G711DECLCML_Callback Function\n",__LINE__); 2121 G711DEC_DPRINT("args = %d ",(int)args[0]); 2122 G711DEC_DPRINT("event = %d\n",event); 2123 2124 2125 2126 switch(event) { 2127 2128 case EMMCodecDspError: 2129 G711DEC_DPRINT("[LCML CALLBACK EVENT] EMMCodecDspError\n"); 2130 break; 2131 2132 case EMMCodecInternalError: 2133 G711DEC_DPRINT("[LCML CALLBACK EVENT] EMMCodecInternalError\n"); 2134 break; 2135 2136 case EMMCodecInitError: 2137 G711DEC_DPRINT("[LCML CALLBACK EVENT] EMMCodecInitError\n"); 2138 break; 2139 2140 case EMMCodecDspMessageRecieved: 2141 G711DEC_DPRINT("[LCML CALLBACK EVENT] EMMCodecDspMessageRecieved\n"); 2142 break; 2143 2144 case EMMCodecBufferProcessed: 2145 G711DEC_DPRINT("[LCML CALLBACK EVENT] EMMCodecBufferProcessed\n"); 2146 break; 2147 2148 case EMMCodecProcessingStarted: 2149 G711DEC_DPRINT("[LCML CALLBACK EVENT] EMMCodecProcessingStarted\n"); 2150 break; 2151 2152 case EMMCodecProcessingPaused: 2153 G711DEC_DPRINT("[LCML CALLBACK EVENT] EMMCodecProcessingPaused\n"); 2154 break; 2155 2156 case EMMCodecProcessingStoped: 2157 G711DEC_DPRINT("[LCML CALLBACK EVENT] EMMCodecProcessingStoped\n"); 2158 break; 2159 2160 case EMMCodecProcessingEof: 2161 G711DEC_DPRINT("[LCML CALLBACK EVENT] EMMCodecProcessingEof\n"); 2162 break; 2163 2164 case EMMCodecBufferNotProcessed: 2165 G711DEC_DPRINT("[LCML CALLBACK EVENT] EMMCodecBufferNotProcessed\n"); 2166 break; 2167 2168 case EMMCodecAlgCtrlAck: 2169 G711DEC_DPRINT("[LCML CALLBACK EVENT] EMMCodecAlgCtrlAck\n"); 2170 break; 2171 2172 case EMMCodecStrmCtrlAck: 2173 G711DEC_DPRINT("[LCML CALLBACK EVENT] EMMCodecStrmCtrlAck\n"); 2174 break; 2175 } 2176 2177 if(event == EMMCodecBufferProcessed) 2178 { 2179 if( (OMX_U32)args [0] == EMMCodecInputBuffer) { 2180 G711DEC_DPRINT("%d :: Input: pBufferr = %p\n",__LINE__, pBuffer); 2181 2182 eError = G711DECGetCorresponding_LCMLHeader(pBuffer, OMX_DirInput, &pLcmlHdr); 2183 if (eError != OMX_ErrorNone) { 2184 G711DEC_DPRINT("%d :: Error: Invalid Buffer Came ...\n",__LINE__); 2185 goto EXIT; 2186 } 2187 G711DEC_ClearPending(pComponentPrivate_CC,pLcmlHdr->buffer,OMX_DirInput); 2188 ret = (OMX_U16) G711DECHandleDataBuf_FromLCML(pComponentPrivate_CC, pLcmlHdr); 2189 if (ret != OMX_ErrorNone) { 2190 G711DEC_DPRINT ("%d :: Error in Writing to the Data pipe\n", __LINE__); 2191 G711DEC_PRINT("Error writting pipe\n"); 2192 eError = OMX_ErrorHardware; 2193 goto EXIT; 2194 } 2195 } 2196 else if ((OMX_U32)args [0] == EMMCodecOuputBuffer) { 2197 2198 G711DEC_DPRINT("%d :: Output: pBufferr = %p\n",__LINE__, pBuffer); 2199 2200 eError = G711DECGetCorresponding_LCMLHeader(pBuffer, OMX_DirOutput, &pLcmlHdr); 2201 if (eError != OMX_ErrorNone) { 2202 G711DEC_DPRINT("%d :: Error: Invalid Buffer Came ...\n",__LINE__); 2203 goto EXIT; 2204 } 2205 if (!pComponentPrivate_CC->bStopSent) 2206 pLcmlHdr->buffer->nFilledLen = (OMX_U32)args[2]; 2207 else 2208 pLcmlHdr->buffer->nFilledLen = 0; 2209 G711DEC_DPRINT("G711DECLCML_Callback::: pLcmlHdr->buffer->nFilledLen = %d\n",(int)pLcmlHdr->buffer->nFilledLen); 2210 pComponentPrivate_CC->lcml_nCntOpReceived++; 2211 2212 G711DEC_ClearPending(pComponentPrivate_CC,pLcmlHdr->buffer,OMX_DirOutput); 2213 ret = (OMX_U16) G711DECHandleDataBuf_FromLCML(pComponentPrivate_CC, pLcmlHdr); 2214 pComponentPrivate_CC->nOutStandingFillDones++; 2215 2216 if (ret != OMX_ErrorNone) { 2217 G711DEC_DPRINT ("%d :: Error in Writing to the Data pipe\n", __LINE__); 2218 eError = OMX_ErrorHardware; 2219 goto EXIT; 2220 } 2221 } 2222 } else if (event == EMMCodecStrmCtrlAck) { 2223 G711DEC_DPRINT("%d :: GOT MESSAGE USN_DSPACK_STRMCTRL ----\n",__LINE__); 2224 } 2225 else if(event == EMMCodecProcessingStoped) { 2226 G711DEC_DPRINT("pComponentPrivate_CC->bNoIdleOnStop = %d\n",(int)pComponentPrivate_CC->bNoIdleOnStop); 2227 2228 if (!pComponentPrivate_CC->bNoIdleOnStop) { 2229 pComponentPrivate_CC->curState = OMX_StateIdle; 2230 #ifdef RESOURCE_MANAGER_ENABLED 2231 eError = RMProxy_NewSendCommand(pComponentPrivate_CC->pHandle, 2232 RMProxy_StateSet, OMX_G711_Decoder_COMPONENT, 2233 OMX_StateIdle, 1234, NULL); 2234 #endif 2235 pComponentPrivate_CC->cbInfo.EventHandler(pComponentPrivate_CC->pHandle, 2236 pComponentPrivate_CC->pHandle->pApplicationPrivate, 2237 OMX_EventCmdComplete, 2238 OMX_CommandStateSet, 2239 pComponentPrivate_CC->curState, 2240 NULL); 2241 } 2242 else { 2243 pComponentPrivate_CC->bDspStoppedWhileExecuting = OMX_TRUE; 2244 pComponentPrivate_CC->bNoIdleOnStop= OMX_FALSE; 2245 } 2246 2247 } 2248 else if (event == EMMCodecProcessingPaused) { 2249 pComponentPrivate_CC->curState = OMX_StatePause; 2250 pComponentPrivate_CC->cbInfo.EventHandler( pComponentPrivate_CC->pHandle, 2251 pComponentPrivate_CC->pHandle->pApplicationPrivate, 2252 OMX_EventCmdComplete, 2253 OMX_CommandStateSet, 2254 pComponentPrivate_CC->curState, 2255 NULL); 2256 } 2257 2258 2259 2260 if(event == EMMCodecDspMessageRecieved) { 2261 G711DEC_DPRINT("%d :: commandedState = %d\n",__LINE__,(int)args[0]); 2262 G711DEC_DPRINT("%d :: arg1 = %d\n",__LINE__,(int)args[1]); 2263 G711DEC_DPRINT("%d :: arg2 = %d\n",__LINE__,(int)args[2]); 2264 } 2265 2266 EXIT: 2267 G711DEC_DPRINT ("%d :: Exiting the G711DECLCML_Callback Function\n",__LINE__); 2268 return eError; 2269 } 2270 /* -------------------------------------------------------------------*/ 2271 /** 2272 * G711DEC_GetCorrespondingLCMLHeader() function will be called by LCML_Callback 2273 * component to write the msg 2274 * @param *pBuffer, Event which gives to details about USN status 2275 * @param G711DEC_LCML_BUFHEADERTYPE **ppLcmlHdr 2276 * @param OMX_DIRTYPE eDir this gives direction of the buffer 2277 * @retval OMX_NoError Success, ready to roll 2278 * OMX_Error_BadParameter The input parameter pointer is null 2279 **/ 2280 /* -------------------------------------------------------------------*/ 2281 OMX_ERRORTYPE G711DECGetCorresponding_LCMLHeader(OMX_U8 *pBuffer, 2282 OMX_DIRTYPE eDir, 2283 LCML_G711DEC_BUFHEADERTYPE **ppLcmlHdr) 2284 { 2285 OMX_ERRORTYPE eError = OMX_ErrorNone; 2286 2287 LCML_G711DEC_BUFHEADERTYPE *pLcmlBufHeader = NULL; 2288 OMX_S16 nIpBuf = (OMX_S16) pComponentPrivate_CC->pInputBufferList->numBuffers; 2289 OMX_S16 nOpBuf = (OMX_S16) pComponentPrivate_CC->pOutputBufferList->numBuffers; 2290 OMX_U16 i = 0; 2291 2292 while (!pComponentPrivate_CC->bInitParamsInitialized) { 2293 G711DEC_DPRINT("Waiting for init to complete\n"); 2294 2295 #ifndef UNDER_CE 2296 sched_yield(); 2297 #else 2298 Sleep(0); 2299 #endif 2300 } 2301 2302 G711DEC_DPRINT("%d :: Inside G711DECGetCorresponding_LCMLHeader..\n",__LINE__); 2303 G711DEC_DPRINT("pComponentPrivate_CC = %p\n",pComponentPrivate_CC); 2304 G711DEC_DPRINT("eDir = %d\n",eDir); 2305 2306 if(eDir == OMX_DirInput) { 2307 G711DEC_DPRINT("Line %d\n",__LINE__); 2308 G711DEC_DPRINT("%d :: Inside G711DECGetCorresponding_LCMLHeader..\n",__LINE__); 2309 G711DEC_DPRINT("pComponentPrivate_CC = %p\n",pComponentPrivate_CC); 2310 2311 pLcmlBufHeader = pComponentPrivate_CC->pLcmlBufHeader[G711DEC_INPUT_PORT]; 2312 G711DEC_DPRINT("%d :: Inside G711DECGetCorresponding_LCMLHeader..\n",__LINE__); 2313 2314 for(i=0; i<nIpBuf; i++) { 2315 G711DEC_DPRINT("%d :: Inside G711DECGetCorresponding_LCMLHeader..\n",__LINE__); 2316 G711DEC_DPRINT("pBuffer = %p\n",pBuffer); 2317 G711DEC_DPRINT("%d :: Inside G711DECGetCorresponding_LCMLHeader..\n",__LINE__); 2318 G711DEC_DPRINT("pLcmlBufHeader->buffer->pBuffer = %p\n",pLcmlBufHeader->buffer->pBuffer); 2319 G711DEC_DPRINT("%d :: Inside G711DECGetCorresponding_LCMLHeader..\n",__LINE__); 2320 2321 if(pBuffer == pLcmlBufHeader->buffer->pBuffer) { 2322 G711DEC_DPRINT("%d :: Inside G711DECGetCorresponding_LCMLHeader..\n",__LINE__); 2323 *ppLcmlHdr = pLcmlBufHeader; 2324 G711DEC_DPRINT("%d::Corresponding LCML Header Found\n",__LINE__); 2325 goto EXIT; 2326 } 2327 pLcmlBufHeader++; 2328 } 2329 } 2330 else if (eDir == OMX_DirOutput) { 2331 G711DEC_DPRINT("Line %d\n",__LINE__); 2332 pLcmlBufHeader = pComponentPrivate_CC->pLcmlBufHeader[G711DEC_OUTPUT_PORT]; 2333 G711DEC_DPRINT("Line %d\n",__LINE__); 2334 2335 for(i=0; i<nOpBuf; i++) { 2336 G711DEC_DPRINT("Line %d\n",__LINE__); 2337 if(pBuffer == pLcmlBufHeader->buffer->pBuffer) { 2338 2339 G711DEC_DPRINT("pBuffer = %p\n",pBuffer); 2340 G711DEC_DPRINT("pLcmlBufHeader->buffer->pBuffer = %p\n",pLcmlBufHeader->buffer->pBuffer); 2341 *ppLcmlHdr = pLcmlBufHeader; 2342 G711DEC_DPRINT("Line %d\n",__LINE__); 2343 G711DEC_DPRINT("%d::Corresponding LCML Header Found\n",__LINE__); 2344 G711DEC_DPRINT("Line %d\n",__LINE__); 2345 2346 goto EXIT; 2347 } 2348 pLcmlBufHeader++; 2349 } 2350 } else { 2351 G711DEC_DPRINT("Line %d\n",__LINE__); 2352 G711DEC_DPRINT("%d:: Invalid Buffer Type :: exiting...\n",__LINE__); 2353 } 2354 G711DEC_DPRINT("Line %d\n",__LINE__); 2355 2356 EXIT: 2357 return eError; 2358 } 2359 2360 2361 #ifndef UNDER_CE 2362 2363 OMX_HANDLETYPE G711DECGetLCMLHandle() 2364 { 2365 void *handle = NULL; 2366 OMX_ERRORTYPE (*fpGetHandle)(OMX_HANDLETYPE); 2367 OMX_HANDLETYPE pHandle = NULL; 2368 char *error = NULL; 2369 OMX_ERRORTYPE eError = OMX_ErrorNone; 2370 2371 G711DEC_DPRINT("G711DECGetLCMLHandle %d\n",__LINE__); 2372 handle = dlopen("libLCML.so", RTLD_LAZY); 2373 if (!handle) { 2374 fputs(dlerror(), stderr); 2375 goto EXIT; 2376 } 2377 2378 fpGetHandle = dlsym (handle, "GetHandle"); 2379 if ((error = dlerror()) != NULL) { 2380 fputs(error, stderr); 2381 goto EXIT; 2382 } 2383 eError = (*fpGetHandle)(&pHandle); 2384 if(eError != OMX_ErrorNone) { 2385 eError = OMX_ErrorUndefined; 2386 G711DEC_DPRINT("eError != OMX_ErrorNone...\n"); 2387 pHandle = NULL; 2388 goto EXIT; 2389 } 2390 2391 pComponentPrivate_CC->bLcmlHandleOpened = 1; 2392 2393 EXIT: 2394 G711DEC_DPRINT("G711DECGetLCMLHandle returning %p\n",pHandle); 2395 2396 return pHandle; 2397 } 2398 2399 2400 #else 2401 /*=======================================================================*/ 2402 /**WINDOWS Explicit dll load procedure */ 2403 /** */ 2404 /*=======================================================================*/ 2405 OMX_HANDLETYPE G711DECGetLCMLHandle() 2406 { 2407 typedef OMX_ERRORTYPE (*LPFNDLLFUNC1)(OMX_HANDLETYPE); 2408 OMX_HANDLETYPE pHandle = NULL; 2409 OMX_ERRORTYPE eError = OMX_ErrorNone; 2410 HINSTANCE hDLL; /* Handle to DLL */ 2411 LPFNDLLFUNC1 fpGetHandle1; 2412 2413 2414 2415 hDLL = LoadLibraryEx(TEXT("OAF_BML.dll"), NULL,0); 2416 if (hDLL == NULL) 2417 { 2418 /* fputs(dlerror(), stderr); */ 2419 G711DEC_DPRINT("BML Load Failed!!!\n"); 2420 return pHandle; 2421 } 2422 2423 fpGetHandle1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,TEXT("GetHandle")); 2424 if (!fpGetHandle1) 2425 { 2426 /* handle the error */ 2427 FreeLibrary(hDLL); 2428 return pHandle; 2429 } 2430 2431 /* call the function */ 2432 eError = fpGetHandle1(&pHandle); 2433 if(eError != OMX_ErrorNone) { 2434 eError = OMX_ErrorUndefined; 2435 G711DEC_DPRINT("eError != OMX_ErrorNone...\n"); 2436 pHandle = NULL; 2437 return pHandle; 2438 } 2439 return pHandle; 2440 } 2441 2442 2443 #endif 2444 /*=======================================================================*/ 2445 /** FREE HANDLE */ 2446 /** */ 2447 /*=======================================================================*/ 2448 #ifndef UNDER_CE 2449 2450 OMX_ERRORTYPE G711DECFreeLCMLHandle() 2451 { 2452 2453 OMX_S16 retValue = 0; 2454 OMX_ERRORTYPE eError = OMX_ErrorNone; 2455 2456 if (pComponentPrivate_CC->bLcmlHandleOpened) { 2457 retValue = dlclose(pComponentPrivate_CC->pLcmlHandle); 2458 2459 if (retValue != 0) { 2460 eError = OMX_ErrorUndefined; 2461 } 2462 pComponentPrivate_CC->bLcmlHandleOpened = 0; 2463 } 2464 2465 return eError; 2466 } 2467 #else 2468 2469 /*=======================================================================*/ 2470 /** FREE HANDLE */ 2471 /** */ 2472 /*=======================================================================*/ 2473 OMX_ERRORTYPE G711DECFreeLCMLHandle() 2474 { 2475 2476 OMX_S16 retValue = 0; 2477 OMX_ERRORTYPE eError = OMX_ErrorNone; 2478 2479 if (pComponentPrivate_CC->bLcmlHandleOpened) { 2480 2481 retValue = FreeLibrary(pComponentPrivate_CC->pLcmlHandle); 2482 if (retValue == 0) { /* Zero Indicates failure */ 2483 eError = OMX_ErrorUndefined; 2484 } 2485 pComponentPrivate_CC->bLcmlHandleOpened = 0; 2486 } 2487 2488 return eError; 2489 } 2490 2491 /*=======================================================================*/ 2492 /** SET PENDING */ 2493 /** */ 2494 /*=======================================================================*/ 2495 #endif 2496 void G711DEC_SetPending(G711DEC_COMPONENT_PRIVATE *pComponentPrivate, 2497 OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir) 2498 { 2499 OMX_U16 i = 0; 2500 if (eDir == OMX_DirInput) { 2501 for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) { 2502 if (pBufHdr == pComponentPrivate->pInputBufferList->pBufHdr[i]) { 2503 pComponentPrivate->pInputBufferList->bBufferPending[i] = 1; 2504 G711DEC_DPRINT("*******************INPUT BUFFER %d IS PENDING******************************\n",i); 2505 } 2506 } 2507 } 2508 else { 2509 for (i=0; i < pComponentPrivate->pOutputBufferList->numBuffers; i++) { 2510 if (pBufHdr == pComponentPrivate->pOutputBufferList->pBufHdr[i]) { 2511 pComponentPrivate->pOutputBufferList->bBufferPending[i] = 1; 2512 G711DEC_DPRINT("*******************OUTPUT BUFFER %d IS PENDING******************************\n",i); 2513 } 2514 } 2515 } 2516 } 2517 /*=======================================================================*/ 2518 /** CLEAR PENDING */ 2519 /** */ 2520 /*=======================================================================*/ 2521 void G711DEC_ClearPending(G711DEC_COMPONENT_PRIVATE *pComponentPrivate, 2522 OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir) 2523 { 2524 OMX_U16 i = 0; 2525 2526 if (eDir == OMX_DirInput) { 2527 for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) { 2528 if (pBufHdr == pComponentPrivate->pInputBufferList->pBufHdr[i]) { 2529 pComponentPrivate->pInputBufferList->bBufferPending[i] = 0; 2530 G711DEC_DPRINT("*******************INPUT BUFFER %d IS RECLAIMED******************************\n",i); 2531 } 2532 } 2533 } 2534 else { 2535 for (i=0; i < pComponentPrivate->pOutputBufferList->numBuffers; i++) { 2536 if (pBufHdr == pComponentPrivate->pOutputBufferList->pBufHdr[i]) { 2537 pComponentPrivate->pOutputBufferList->bBufferPending[i] = 0; 2538 G711DEC_DPRINT("*******************OUTPUT BUFFER %d IS RECLAIMED ******************************\n",i); 2539 } 2540 } 2541 } 2542 } 2543 2544 OMX_U32 G711DEC_IsPending(G711DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir) 2545 { 2546 OMX_U16 i = 0; 2547 2548 if (eDir == OMX_DirInput) { 2549 for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) { 2550 if (pBufHdr == pComponentPrivate->pInputBufferList->pBufHdr[i]) { 2551 return pComponentPrivate->pInputBufferList->bBufferPending[i]; 2552 } 2553 } 2554 } 2555 else { 2556 for (i=0; i < pComponentPrivate->pOutputBufferList->numBuffers; i++) { 2557 if (pBufHdr == pComponentPrivate->pOutputBufferList->pBufHdr[i]) { 2558 return pComponentPrivate->pOutputBufferList->bBufferPending[i]; 2559 } 2560 } 2561 } 2562 return -1; 2563 } 2564 2565 2566 OMX_U32 G711DEC_IsValid(G711DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U8 *pBuffer, OMX_DIRTYPE eDir) 2567 { 2568 OMX_U16 i = 0; 2569 OMX_S16 found=0; 2570 2571 if (eDir == OMX_DirInput) { 2572 for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) { 2573 if (pBuffer == pComponentPrivate->pInputBufferList->pBufHdr[i]->pBuffer) { 2574 found = 1; 2575 } 2576 } 2577 } 2578 else { 2579 for (i=0; i < pComponentPrivate->pOutputBufferList->numBuffers; i++) { 2580 if (pBuffer == pComponentPrivate->pOutputBufferList->pBufHdr[i]->pBuffer) { 2581 found = 1; 2582 } 2583 } 2584 } 2585 return found; 2586 } 2587 2588 /*=======================================================================*/ 2589 /** G711DECFill_LCMLInitParamsEx */ 2590 /** */ 2591 /*=======================================================================*/ 2592 OMX_ERRORTYPE G711DECFill_LCMLInitParamsEx (OMX_HANDLETYPE pComponent ) 2593 { 2594 OMX_ERRORTYPE eError = OMX_ErrorNone; 2595 OMX_U32 nIpBuf = 0,nIpBufSize = 0,nOpBuf = 0,nOpBufSize = 0; 2596 OMX_U16 i = 0; 2597 OMX_BUFFERHEADERTYPE *pTemp = NULL; 2598 OMX_S16 size_lcml = 0; 2599 LCML_STRMATTR *strmAttr = NULL; 2600 2601 LCML_DSP_INTERFACE *pHandle = (LCML_DSP_INTERFACE *)pComponent; 2602 G711DEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 2603 LCML_G711DEC_BUFHEADERTYPE *pTemp_lcml = NULL; 2604 2605 G711DEC_DPRINT("%d :: G711DECFill_LCMLInitParams\n ",__LINE__); 2606 G711DEC_DPRINT("%d :: pHandle = %p\n",__LINE__,pHandle); 2607 G711DEC_DPRINT("%d :: pHandle->pComponentPrivate = %p\n",__LINE__,pHandle->pComponentPrivate); 2608 pComponentPrivate = pHandle->pComponentPrivate; 2609 2610 nIpBuf = pComponentPrivate->pInputBufferList->numBuffers; 2611 2612 nIpBufSize = (pComponentPrivate->pPortDef[G711DEC_INPUT_PORT]->nBufferSize); 2613 2614 nOpBuf = pComponentPrivate->pOutputBufferList->numBuffers; 2615 nOpBufSize = (pComponentPrivate->pPortDef[G711DEC_OUTPUT_PORT]->nBufferSize); 2616 2617 2618 size_lcml = (OMX_U16) (nIpBuf * sizeof(LCML_G711DEC_BUFHEADERTYPE)); 2619 G711D_OMX_MALLOC_SIZE(pTemp_lcml, size_lcml, LCML_G711DEC_BUFHEADERTYPE); 2620 pComponentPrivate->pLcmlBufHeader[G711DEC_INPUT_PORT] = pTemp_lcml; 2621 2622 for (i=0; i<nIpBuf; i++) { 2623 pTemp = pComponentPrivate->pInputBufferList->pBufHdr[i]; 2624 pTemp->nSize = sizeof(OMX_BUFFERHEADERTYPE); 2625 pTemp->nAllocLen = nIpBufSize; 2626 pTemp->nFilledLen = nIpBufSize; 2627 pTemp->nVersion.s.nVersionMajor = G711DEC_MAJOR_VER; 2628 pTemp->nVersion.s.nVersionMinor = G711DEC_MINOR_VER; 2629 pTemp->pPlatformPrivate = pHandle->pComponentPrivate; 2630 pTemp->nTickCount = NOT_USED; 2631 pTemp_lcml->buffer = pTemp; 2632 pTemp_lcml->eDir = OMX_DirInput; 2633 2634 G711D_OMX_MALLOC(pTemp_lcml->pIpParam, G711DEC_UAlgInBufParamStruct); 2635 2636 pTemp_lcml->pIpParam->usFrameLost = 0; 2637 pTemp_lcml->pIpParam->usEndOfFile = 0; 2638 2639 G711D_OMX_MALLOC(pTemp_lcml->pDmmBuf,DMM_BUFFER_OBJ); 2640 /* This means, it is not a last buffer. This flag is to be modified by the application to indicate the last buffer */ 2641 pTemp->nFlags = NORMAL_BUFFER; 2642 pTemp_lcml++; 2643 } 2644 2645 /* Allocate memory for all output buffer headers. This memory pointer will be sent to LCML */ 2646 size_lcml = (OMX_U16) (nOpBuf * sizeof(LCML_G711DEC_BUFHEADERTYPE) ); 2647 G711D_OMX_MALLOC_SIZE(pTemp_lcml, size_lcml, LCML_G711DEC_BUFHEADERTYPE); 2648 pComponentPrivate->pLcmlBufHeader[G711DEC_OUTPUT_PORT] = pTemp_lcml; 2649 2650 for (i=0; i<nOpBuf; i++) { 2651 pTemp = pComponentPrivate->pOutputBufferList->pBufHdr[i]; 2652 pTemp->nSize = sizeof(OMX_BUFFERHEADERTYPE); 2653 pTemp->nAllocLen = nOpBufSize; 2654 pTemp->nFilledLen = nOpBufSize; 2655 pTemp->nVersion.s.nVersionMajor = G711DEC_MAJOR_VER; 2656 pTemp->nVersion.s.nVersionMinor = G711DEC_MINOR_VER; 2657 pComponentPrivate->nVersion = pTemp->nVersion.nVersion; 2658 pTemp->pPlatformPrivate = pHandle->pComponentPrivate; 2659 pTemp->nTickCount = NOT_USED; 2660 2661 /* This means, it is not a last buffer. This flag is to be modified by the application to indicate the last buffer */ 2662 pTemp_lcml->buffer = pTemp; 2663 pTemp_lcml->eDir = OMX_DirOutput; 2664 G711DEC_DPRINT("%d:::pTemp_lcml = %p\n",__LINE__,pTemp_lcml); 2665 G711DEC_DPRINT("%d:::pTemp_lcml->buffer = %p\n",__LINE__,pTemp_lcml->buffer); 2666 2667 pTemp->nFlags = NORMAL_BUFFER; 2668 2669 pTemp++; 2670 pTemp_lcml++; 2671 } 2672 pComponentPrivate->bPortDefsAllocated = 1; 2673 G711DEC_DPRINT("%d :: Exiting G711DECFill_LCMLInitParams",__LINE__); 2674 2675 pComponentPrivate->bInitParamsInitialized = 1; 2676 EXIT: 2677 if(eError == OMX_ErrorInsufficientResources) 2678 { 2679 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pLcmlBufHeader[G711DEC_INPUT_PORT]); 2680 OMX_G711DECMEMFREE_STRUCT(strmAttr); 2681 if (pTemp_lcml != NULL) { 2682 OMX_G711DECMEMFREE_STRUCT(pTemp_lcml->pIpParam); 2683 } 2684 OMX_G711DECMEMFREE_STRUCT(pComponentPrivate->pLcmlBufHeader[G711DEC_OUTPUT_PORT]); 2685 } 2686 return eError; 2687 } 2688 2689 /** ======================================================================== 2690 * OMX_DmmMap () method is used to allocate the memory using DMM. 2691 * 2692 * @param ProcHandle - Component identification number 2693 * @param size - Buffer header address, that needs to be sent to codec 2694 * @param pArmPtr - Message used to send the buffer to codec 2695 * @param pDmmBuf - buffer id 2696 * 2697 * @retval OMX_ErrorNone - Success 2698 * OMX_ErrorHardware - Hardware Error 2699 ** ==========================================================================*/ 2700 OMX_ERRORTYPE OMX_DmmMap(DSP_HPROCESSOR ProcHandle, 2701 int size, 2702 void* pArmPtr, 2703 DMM_BUFFER_OBJ* pDmmBuf) 2704 { 2705 OMX_ERRORTYPE eError = OMX_ErrorUndefined; 2706 DSP_STATUS status = DSP_SOK; 2707 int nSizeReserved = 0; 2708 2709 G711DEC_PRINT("OMX_DmmMap %d\n",__LINE__); 2710 if(pDmmBuf == NULL) 2711 { 2712 G711DEC_PRINT("pBuf is NULL\n"); 2713 eError = OMX_ErrorBadParameter; 2714 goto EXIT; 2715 } 2716 2717 if(pArmPtr == NULL) 2718 { 2719 G711DEC_PRINT("pBuf is NULL\n"); 2720 eError = OMX_ErrorBadParameter; 2721 goto EXIT; 2722 } 2723 2724 /* Allocate */ 2725 pDmmBuf->pAllocated = pArmPtr; 2726 /* Reserve */ 2727 nSizeReserved = ROUND_TO_PAGESIZE(size) + 2*DMM_PAGE_SIZE ; 2728 status = DSPProcessor_ReserveMemory(ProcHandle, nSizeReserved, &(pDmmBuf->pReserved)); 2729 G711DEC_DPRINT("\nOMX Reserve DSP: %p\n",pDmmBuf->pReserved); 2730 2731 if(DSP_FAILED(status)) 2732 { 2733 G711DEC_PRINT("DSPProcessor_ReserveMemory() failed - error 0x%x", (int)status); 2734 eError = OMX_ErrorHardware; 2735 goto EXIT; 2736 } 2737 pDmmBuf->nSize = size; 2738 G711DEC_DPRINT(" DMM MAP Reserved: %p, size 0x%x (%d)\n", pDmmBuf->pReserved,nSizeReserved,nSizeReserved); 2739 2740 /* Map */ 2741 status = DSPProcessor_Map(ProcHandle, 2742 pDmmBuf->pAllocated,/* Arm addres of data to Map on DSP*/ 2743 size , /* size to Map on DSP*/ 2744 pDmmBuf->pReserved, /* reserved space */ 2745 &(pDmmBuf->pMapped), /* returned map pointer */ 2746 0); /* final param is reserved. set to zero. */ 2747 2748 if(DSP_FAILED(status)) 2749 { 2750 G711DEC_PRINT("DSPProcessor_Map() failed - error 0x%x", (int)status); 2751 eError = OMX_ErrorHardware; 2752 goto EXIT; 2753 } 2754 G711DEC_DPRINT("DMM Mapped: %p, size 0x%x (%d)\n",pDmmBuf->pMapped, size,size); 2755 2756 /* Issue an initial memory flush to ensure cache coherency */ 2757 status = DSPProcessor_FlushMemory(ProcHandle, pDmmBuf->pAllocated, size, 0); 2758 if(DSP_FAILED(status)) 2759 { 2760 G711DEC_PRINT("Unable to flush mapped buffer: error 0x%x",(int)status); 2761 goto EXIT; 2762 } 2763 eError = OMX_ErrorNone; 2764 2765 EXIT: 2766 return eError; 2767 } 2768 2769 /** ======================================================================== 2770 * OMX_DmmUnMap () method is used to de-allocate the memory using DMM. 2771 * 2772 * @param ProcHandle - Component identification number 2773 * @param pMapPtr - Map address 2774 * @param pResPtr - reserve adress 2775 * 2776 * @retval OMX_ErrorNone - Success 2777 * OMX_ErrorHardware - Hardware Error 2778 ** ==========================================================================*/ 2779 OMX_ERRORTYPE OMX_DmmUnMap(DSP_HPROCESSOR ProcHandle, void* pMapPtr, void* pResPtr) 2780 { 2781 G711DEC_PRINT("OMX_DmmUnMap %d\n",__LINE__); 2782 DSP_STATUS status = DSP_SOK; 2783 OMX_ERRORTYPE eError = OMX_ErrorNone; 2784 G711DEC_DPRINT("\nOMX UnReserve DSP: %p\n",pResPtr); 2785 2786 if(pMapPtr == NULL) 2787 { 2788 G711DEC_PRINT("pMapPtr is NULL\n"); 2789 eError = OMX_ErrorBadParameter; 2790 goto EXIT; 2791 } 2792 if(pResPtr == NULL) 2793 { 2794 G711DEC_PRINT("pResPtr is NULL\n"); 2795 eError = OMX_ErrorBadParameter; 2796 goto EXIT; 2797 } 2798 status = DSPProcessor_UnMap(ProcHandle,pMapPtr); 2799 if(DSP_FAILED(status)) 2800 { 2801 G711DEC_PRINT("DSPProcessor_UnMap() failed - error 0x%x",(int)status); 2802 } 2803 2804 G711DEC_DPRINT("unreserving structure =0x%p\n",pResPtr ); 2805 status = DSPProcessor_UnReserveMemory(ProcHandle,pResPtr); 2806 if(DSP_FAILED(status)) 2807 { 2808 G711DEC_PRINT("DSPProcessor_UnReserveMemory() failed - error 0x%x", (int)status); 2809 } 2810 2811 EXIT: 2812 return eError; 2813 } 2814 2815 #ifdef RESOURCE_MANAGER_ENABLED 2816 /*********************************** 2817 * Callback to the RM * 2818 ***********************************/ 2819 void G711DEC_ResourceManagerCallback(RMPROXY_COMMANDDATATYPE cbData) 2820 { 2821 OMX_COMMANDTYPE Cmd = OMX_CommandStateSet; 2822 OMX_STATETYPE state = OMX_StateIdle; 2823 OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)cbData.hComponent; 2824 G711DEC_COMPONENT_PRIVATE *pCompPrivate = NULL; 2825 2826 pCompPrivate = (G711DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 2827 2828 if (*(cbData.RM_Error) == OMX_RmProxyCallback_ResourcesPreempted){ 2829 if (pCompPrivate->curState == OMX_StateExecuting || 2830 pCompPrivate->curState == OMX_StatePause) { 2831 2832 write (pCompPrivate->cmdPipe[1], &Cmd, sizeof(Cmd)); 2833 write (pCompPrivate->cmdDataPipe[1], &state ,sizeof(OMX_U32)); 2834 2835 pCompPrivate->bPreempted = 1; 2836 } 2837 } 2838 else if (*(cbData.RM_Error) == OMX_RmProxyCallback_ResourcesAcquired){ 2839 pCompPrivate->cbInfo.EventHandler ( pHandle, 2840 pHandle->pApplicationPrivate, 2841 OMX_EventResourcesAcquired, 2842 0, 0, NULL); 2843 } 2844 } 2845 #endif 2846