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_G729Decoder.c 30 * 31 * This file implements OMX Component for G729 decoder that 32 * is fully compliant with the OMX Audio specification . 33 * 34 * @path $(OMAPSW_MPU)\linux\audio\src\openmax_il\g729_dec\src 35 * 36 * @rev 0.4 37 */ 38/* ----------------------------------------------------------------------------- 39 *! 40 *! Revision History 41 *! =================================== 42 *! Date Author(s) Version Description 43 *! --------- ------------------- ------- --------------------------------- 44 *! 03-Jan-2007 A.Donjon 0.1 Code update for G729 DECODER 45 *! 01-Mar-2007 A.Donjon 0.2 RM, DVFS changes 46 *! 08-Jun-2007 A.Donjon 0.3 Variable input buffer size 47 *! 04-Jul-2007 A.Donjon 0.4 Init params 48 *! 49 *! 50 * ================================================================================= */ 51 52/* ------compilation control switches -------------------------*/ 53 54/**************************************************************** 55 * INCLUDE FILES 56 ****************************************************************/ 57/* ----- system and platform files ----------------------------*/ 58 59#ifdef UNDER_CE 60#include <windows.h> 61#include <oaf_osal.h> 62#include <omx_core.h> 63#else 64#include <unistd.h> 65#include <sys/time.h> 66#include <sys/types.h> 67#include <sys/ioctl.h> 68#include <sys/select.h> 69#include <errno.h> 70#include <pthread.h> 71 72#endif 73#include <string.h> 74#include <fcntl.h> 75#include <stdlib.h> 76#include <stdio.h> 77#include <dbapi.h> 78 79/*-------program files ----------------------------------------*/ 80 81#ifdef __PERF_INSTRUMENTATION__ 82#include "perf.h" 83#endif 84 85#include <OMX_Component.h> 86#include <TIDspOmx.h> 87 88#include "OMX_G729Decoder.h" 89#include "OMX_G729Dec_Utils.h" 90 91/**************************************************************** 92 * EXTERNAL REFERENCES NOTE : only use if not found in header file 93 ****************************************************************/ 94/*--------data declarations -----------------------------------*/ 95 96/*--------function prototypes ---------------------------------*/ 97 98/**************************************************************** 99 * PUBLIC DECLARATIONS Defined here, used elsewhere 100 ****************************************************************/ 101/*--------data declarations -----------------------------------*/ 102 103/*--------function prototypes ---------------------------------*/ 104 105/**************************************************************** 106 * PRIVATE DECLARATIONS Defined here, used only here 107 ****************************************************************/ 108/*--------data declarations -----------------------------------*/ 109 110/*--------function prototypes ---------------------------------*/ 111 112static OMX_ERRORTYPE SetCallbacks (OMX_HANDLETYPE hComp, 113 OMX_CALLBACKTYPE* pCallBacks, OMX_PTR pAppData); 114static OMX_ERRORTYPE GetComponentVersion (OMX_HANDLETYPE hComp, 115 OMX_STRING pComponentName, 116 OMX_VERSIONTYPE* pComponentVersion, 117 OMX_VERSIONTYPE* pSpecVersion, 118 OMX_UUIDTYPE* pComponentUUID); 119 120static OMX_ERRORTYPE SendCommand (OMX_HANDLETYPE hComp, OMX_COMMANDTYPE nCommand, 121 OMX_U32 nParam, OMX_PTR pCmdData); 122 123static OMX_ERRORTYPE GetParameter(OMX_HANDLETYPE hComp, OMX_INDEXTYPE nParamIndex, 124 OMX_PTR ComponentParamStruct); 125static OMX_ERRORTYPE SetParameter (OMX_HANDLETYPE hComp, 126 OMX_INDEXTYPE nParamIndex, 127 OMX_PTR ComponentParamStruct); 128static OMX_ERRORTYPE GetConfig (OMX_HANDLETYPE hComp, 129 OMX_INDEXTYPE nConfigIndex, 130 OMX_PTR pComponentConfigStructure); 131static OMX_ERRORTYPE SetConfig (OMX_HANDLETYPE hComp, 132 OMX_INDEXTYPE nConfigIndex, 133 OMX_PTR pComponentConfigStructure); 134 135static OMX_ERRORTYPE EmptyThisBuffer (OMX_HANDLETYPE hComp, OMX_BUFFERHEADERTYPE* pBuffer); 136 137static OMX_ERRORTYPE FillThisBuffer (OMX_HANDLETYPE hComp, OMX_BUFFERHEADERTYPE* pBuffer); 138static OMX_ERRORTYPE GetState (OMX_HANDLETYPE hComp, OMX_STATETYPE* pState); 139static OMX_ERRORTYPE ComponentTunnelRequest (OMX_HANDLETYPE hComp, 140 OMX_U32 nPort, OMX_HANDLETYPE hTunneledComp, 141 OMX_U32 nTunneledPort, 142 OMX_TUNNELSETUPTYPE* pTunnelSetup); 143 144static OMX_ERRORTYPE ComponentDeInit(OMX_HANDLETYPE pHandle); 145static OMX_ERRORTYPE AllocateBuffer (OMX_IN OMX_HANDLETYPE hComponent, 146 OMX_INOUT OMX_BUFFERHEADERTYPE** pBuffer, 147 OMX_IN OMX_U32 nPortIndex, 148 OMX_IN OMX_PTR pAppPrivate, 149 OMX_IN OMX_U32 nSizeBytes); 150 151static OMX_ERRORTYPE FreeBuffer( 152 OMX_IN OMX_HANDLETYPE hComponent, 153 OMX_IN OMX_U32 nPortIndex, 154 OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); 155 156static OMX_ERRORTYPE UseBuffer ( 157 OMX_IN OMX_HANDLETYPE hComponent, 158 OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr, 159 OMX_IN OMX_U32 nPortIndex, 160 OMX_IN OMX_PTR pAppPrivate, 161 OMX_IN OMX_U32 nSizeBytes, 162 OMX_IN OMX_U8* pBuffer); 163 164static OMX_ERRORTYPE GetExtensionIndex( 165 OMX_IN OMX_HANDLETYPE hComponent, 166 OMX_IN OMX_STRING cParameterName, 167 OMX_OUT OMX_INDEXTYPE *pIndexType); 168 169static OMX_ERRORTYPE ComponentRoleEnum( 170 OMX_IN OMX_HANDLETYPE hComponent, 171 OMX_OUT OMX_U8 *cRole, 172 OMX_IN OMX_U32 nIndex); 173 174/* ======================================================================= */ 175/** 176 * @def FIFO1, FIFO2 Define Fifo Path 177 */ 178/* ======================================================================= */ 179#define FIFO1 "/dev/fifo.1" 180#define FIFO2 "/dev/fifo.2" 181 182/* ======================================================================= */ 183/** 184 * @def PERMS Define Read and Write Permisions. 185 */ 186/* ======================================================================= */ 187#define PERMS 0666 188 189#ifdef DSP_RENDERING_ON 190AM_COMMANDDATATYPE cmd_data; 191#endif 192 193 194 195/*--------macros ----------------------------------------------*/ 196 197 198/*-------------------------------------------------------------------*/ 199/** 200 * OMX_ComponentInit() Set the all the function pointers of component 201 * 202 * This method will update the component function pointer to the handle 203 * 204 * @param hComp handle for this instance of the component 205 * 206 * @retval OMX_NoError Success, ready to roll 207 * OMX_ErrorInsufficientResources If the malloc fails 208 **/ 209/*-------------------------------------------------------------------*/ 210OMX_ERRORTYPE OMX_ComponentInit (OMX_HANDLETYPE hComp) 211{ 212 OMX_PARAM_PORTDEFINITIONTYPE *pPortDef_ip = NULL; 213 OMX_PARAM_PORTDEFINITIONTYPE* pPortDef_op = NULL; 214 OMX_AUDIO_PARAM_PORTFORMATTYPE *pInPortFormat = NULL; 215 OMX_AUDIO_PARAM_PORTFORMATTYPE *pOutPortFormat = NULL; 216 G729DEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 217 OMX_AUDIO_PARAM_G729TYPE *g729_ip = NULL; 218 OMX_AUDIO_PARAM_PCMMODETYPE *g729_op = NULL; 219 OMX_ERRORTYPE error = OMX_ErrorNone; 220 OMX_ERRORTYPE eError = OMX_ErrorNone; 221 OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE*) hComp; 222 OMX_S16 i=0; 223 224 G729DEC_DPRINT ("%d ::OMX_ComponentInit\n", __LINE__); 225 /*Set the all component function pointer to the handle */ 226 pHandle->SetCallbacks = SetCallbacks; 227 pHandle->GetComponentVersion = GetComponentVersion; 228 pHandle->SendCommand = SendCommand; 229 pHandle->GetParameter = GetParameter; 230 pHandle->SetParameter = SetParameter; 231 pHandle->GetConfig = GetConfig; 232 pHandle->SetConfig = SetConfig; 233 pHandle->GetState = GetState; 234 pHandle->EmptyThisBuffer = EmptyThisBuffer; 235 pHandle->FillThisBuffer = FillThisBuffer; 236 pHandle->ComponentTunnelRequest = ComponentTunnelRequest; 237 pHandle->ComponentDeInit = ComponentDeInit; 238 pHandle->AllocateBuffer = AllocateBuffer; 239 pHandle->FreeBuffer = FreeBuffer; 240 pHandle->UseBuffer = UseBuffer; 241 pHandle->GetExtensionIndex = GetExtensionIndex; 242 pHandle->ComponentRoleEnum = ComponentRoleEnum; 243 244 /*Allocate the memory for Component private data area */ 245 OMX_G729MALLOC_STRUCT(pHandle->pComponentPrivate,G729DEC_COMPONENT_PRIVATE); 246 if(pHandle->pComponentPrivate == NULL) { 247 error = OMX_ErrorInsufficientResources; 248 goto EXIT; 249 } 250 251 ((G729DEC_COMPONENT_PRIVATE *) 252 pHandle->pComponentPrivate)->pHandle = pHandle; 253 pComponentPrivate = pHandle->pComponentPrivate; 254 255#ifdef __PERF_INSTRUMENTATION__ 256 pComponentPrivate->pPERF = PERF_Create(PERF_FOURCC('7','2','9',' '), 257 PERF_ModuleLLMM | 258 PERF_ModuleAudioDecode); 259#endif 260 261 /* Initialize component data structures to default values */ 262 pComponentPrivate->sPortParam.nPorts = 0x2; 263 pComponentPrivate->sPortParam.nStartPortNumber = 0x0; 264 error = OMX_ErrorNone; 265 266 OMX_G729MALLOC_STRUCT(g729_ip, OMX_AUDIO_PARAM_G729TYPE); 267 OMX_G729MALLOC_STRUCT(g729_op, OMX_AUDIO_PARAM_PCMMODETYPE); 268 269 ((G729DEC_COMPONENT_PRIVATE *) 270 pHandle->pComponentPrivate)->g729Params = g729_ip; 271 ((G729DEC_COMPONENT_PRIVATE *) 272 pHandle->pComponentPrivate)->pcmParams = g729_op; 273 274 G729DEC_DPRINT("%d Malloced g729Params = 0x%p\n",__LINE__,((G729DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate)->g729Params); 275 G729DEC_DPRINT("%d Malloced pcmParams = 0x%p\n",__LINE__,((G729DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate)->pcmParams); 276 277 278 OMX_G729MALLOC_STRUCT(pComponentPrivate->pInputBufferList, G729DEC_BUFFERLIST); 279 280 pComponentPrivate->pInputBufferList->numBuffers = 0; /* initialize number of buffers */ 281 OMX_G729MALLOC_STRUCT(pComponentPrivate->pOutputBufferList, G729DEC_BUFFERLIST); 282 283 pComponentPrivate->pOutputBufferList->numBuffers = 0; /* initialize number of buffers */ 284 pComponentPrivate->bPlayCompleteFlag = 0; 285 for (i=0; i < MAX_NUM_OF_BUFS; i++) { 286 pComponentPrivate->pOutputBufferList->pBufHdr[i] = NULL; 287 pComponentPrivate->pInputBufferList->pBufHdr[i] = NULL; 288 pComponentPrivate->arrTickCount[i] = 0; 289 pComponentPrivate->arrTimestamp[i] = 0; 290 } 291 292 G729DEC_DPRINT("Setting dasfmode to 0\n"); 293 pComponentPrivate->rtmx = 0; 294 pComponentPrivate->dasfmode = 0; 295 pComponentPrivate->bPortDefsAllocated = 1; 296 pComponentPrivate->bCompThreadStarted = 0; 297 pComponentPrivate->nHoldLength = 0; 298 pComponentPrivate->pHoldBuffer = NULL; 299 pComponentPrivate->bInitParamsInitialized = 0; 300 pComponentPrivate->pMarkBuf = NULL; 301 pComponentPrivate->pMarkData = NULL; 302 pComponentPrivate->nEmptyBufferDoneCount = 0; 303 pComponentPrivate->nEmptyThisBufferCount = 0; 304 pComponentPrivate->nFillBufferDoneCount = 0; 305 pComponentPrivate->nFillThisBufferCount = 0; 306 pComponentPrivate->strmAttr = NULL; 307 pComponentPrivate->nDataWritesWhilePaused = 0; 308 pComponentPrivate->bIdleCommandPending = 0; 309 pComponentPrivate->bDisableCommandParam = 0; 310 for (i=0; i < MAX_NUM_OF_BUFS; i++) { 311 pComponentPrivate->pInputBufHdrPending[i] = NULL; 312 pComponentPrivate->pOutputBufHdrPending[i] = NULL; 313 } 314 pComponentPrivate->bJustReenabled = 0; 315 pComponentPrivate->nInvalidFrameCount = 0; 316 pComponentPrivate->nNumInputBufPending = 0; 317 pComponentPrivate->nNumOutputBufPending = 0; 318 pComponentPrivate->bDisableCommandPending = 0; 319 pComponentPrivate->nOutStandingFillDones = 0; 320 pComponentPrivate->bStopSent=0; 321 pComponentPrivate->bBypassDSP = OMX_FALSE; 322 pComponentPrivate->bNoIdleOnStop = OMX_FALSE; 323 pComponentPrivate->pParams = NULL; 324 pComponentPrivate->sDeviceString = malloc(100*sizeof(OMX_STRING)); 325 if (pComponentPrivate->sDeviceString == NULL) { 326 G729DEC_DPRINT("%d ::malloc failed\n", __LINE__); 327 goto EXIT; 328 } 329 strcpy((char*)pComponentPrivate->sDeviceString,"/eteedn:i0:o0/codec\0"); 330 pComponentPrivate->IpBufindex = 0; 331 pComponentPrivate->OpBufindex = 0; 332 pComponentPrivate->nUnhandledFillThisBuffers=0; 333 pComponentPrivate->nUnhandledEmptyThisBuffers = 0; 334 pComponentPrivate->bFlushOutputPortCommandPending = OMX_FALSE; 335 pComponentPrivate->bFlushInputPortCommandPending = OMX_FALSE; 336 pComponentPrivate->bFlushEventPending = 0; 337 pComponentPrivate->bPreempted = OMX_FALSE; 338 339 /* G729 format defaults */ 340 g729_ip->nPortIndex = 0; 341 342 /* PCM format defaults */ 343 g729_op->nPortIndex = 1; 344 g729_op->nChannels = 2; 345 g729_op->eNumData= OMX_NumericalDataSigned; 346 g729_op->nBitPerSample = 16; 347 g729_op->nSamplingRate = 44100; 348 g729_op->ePCMMode = OMX_AUDIO_PCMModeLinear; 349 350 /* Malloc and Set pPriorityMgmt defaults */ 351 OMX_G729MALLOC_STRUCT(pComponentPrivate->sPriorityMgmt, OMX_PRIORITYMGMTTYPE); 352 OMX_G729CONF_INIT_STRUCT(pComponentPrivate->sPriorityMgmt, OMX_PRIORITYMGMTTYPE); 353 354 /* Initialize sPriorityMgmt data structures to default values */ 355 pComponentPrivate->sPriorityMgmt->nGroupPriority = -1; 356 pComponentPrivate->sPriorityMgmt->nGroupID = -1; 357 358 /* Set input port defaults */ 359 OMX_G729MALLOC_STRUCT(pPortDef_ip, OMX_PARAM_PORTDEFINITIONTYPE); 360 OMX_G729CONF_INIT_STRUCT(pPortDef_ip, OMX_PARAM_PORTDEFINITIONTYPE); 361 pComponentPrivate->pPortDef[G729DEC_INPUT_PORT] = pPortDef_ip; 362 363 G729DEC_MEMPRINT("%d:[ALLOC] %p\n",__LINE__,pPortDef_ip); 364 365#ifdef UNDER_CE 366 memset(pPortDef_ip,0,sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); 367#endif 368 369 /* Set input port defaults */ 370 OMX_G729MALLOC_STRUCT(pPortDef_op, OMX_PARAM_PORTDEFINITIONTYPE); 371 OMX_G729CONF_INIT_STRUCT(pPortDef_op, OMX_PARAM_PORTDEFINITIONTYPE); 372 pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT] = pPortDef_op; 373 374 375 G729DEC_MEMPRINT("%d:[ALLOC] %p\n",__LINE__,pPortDef_op); 376 377#ifdef UNDER_CE 378 memset(pPortDef_op,0,sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); 379#endif 380 381 G729DEC_DPRINT ("%d ::pPortDef_ip = 0x%x\n", __LINE__,pPortDef_ip); 382 G729DEC_DPRINT ("%d ::pPortDef_op = 0x%x\n", __LINE__,pPortDef_op); 383 384 pPortDef_ip->nPortIndex = 0x0; 385 pPortDef_ip->nBufferCountActual = NUM_G729DEC_INPUT_BUFFERS; 386 pPortDef_ip->nBufferCountMin = NUM_G729DEC_INPUT_BUFFERS; 387 pPortDef_ip->eDir = OMX_DirInput; 388 pPortDef_ip->bEnabled = OMX_TRUE; 389 pPortDef_ip->nBufferSize = INPUT_G729DEC_BUFFER_SIZE_MIN; 390 pPortDef_ip->bPopulated = 0; 391 pPortDef_ip->eDomain = OMX_PortDomainAudio; 392 pPortDef_ip->format.audio.eEncoding = OMX_AUDIO_CodingG729; 393 394 pPortDef_op->nPortIndex = 0x1; 395 pPortDef_op->nBufferCountActual = NUM_G729DEC_OUTPUT_BUFFERS; 396 pPortDef_op->nBufferCountMin = NUM_G729DEC_OUTPUT_BUFFERS; 397 pPortDef_op->eDir = OMX_DirOutput; 398 pPortDef_op->bEnabled = OMX_TRUE; 399 pPortDef_op->nBufferSize = OUTPUT_G729DEC_BUFFER_SIZE_MIN; 400 pPortDef_op->bPopulated = 0; 401 pPortDef_op->eDomain = OMX_PortDomainAudio; 402 pPortDef_op->format.audio.eEncoding = OMX_AUDIO_CodingPCM; 403 404 OMX_G729MALLOC_STRUCT(pComponentPrivate->pInPortFormat, OMX_AUDIO_PARAM_PORTFORMATTYPE); 405 OMX_G729CONF_INIT_STRUCT(pComponentPrivate->pInPortFormat, OMX_AUDIO_PARAM_PORTFORMATTYPE); 406 /* Set input port format defaults */ 407 pInPortFormat = pComponentPrivate->pInPortFormat; 408 OMX_G729CONF_INIT_STRUCT(pInPortFormat, OMX_AUDIO_PARAM_PORTFORMATTYPE); 409 pInPortFormat->nPortIndex = G729DEC_INPUT_PORT; 410 pInPortFormat->nIndex = OMX_IndexParamAudioG729; 411 pInPortFormat->eEncoding = OMX_AUDIO_CodingG729; 412 413 /* Set output port format defaults */ 414 OMX_G729MALLOC_STRUCT(pComponentPrivate->pOutPortFormat, OMX_AUDIO_PARAM_PORTFORMATTYPE); 415 OMX_G729CONF_INIT_STRUCT(pComponentPrivate->pOutPortFormat, OMX_AUDIO_PARAM_PORTFORMATTYPE); 416 pOutPortFormat = (OMX_AUDIO_PARAM_PORTFORMATTYPE*) pComponentPrivate->pOutPortFormat; 417 OMX_G729CONF_INIT_STRUCT(pOutPortFormat, OMX_AUDIO_PARAM_PORTFORMATTYPE); 418 pOutPortFormat->nPortIndex = G729DEC_OUTPUT_PORT; 419 pOutPortFormat->nIndex = OMX_IndexParamAudioPcm; 420 pOutPortFormat->eEncoding = OMX_AUDIO_CodingPCM; 421 422#ifndef UNDER_CE 423 pthread_mutex_init(&pComponentPrivate->AlloBuf_mutex, NULL); 424 pthread_cond_init (&pComponentPrivate->AlloBuf_threshold, NULL); 425 pComponentPrivate->AlloBuf_waitingsignal = 0; 426 427 pthread_mutex_init(&pComponentPrivate->InLoaded_mutex, NULL); 428 pthread_cond_init (&pComponentPrivate->InLoaded_threshold, NULL); 429 pComponentPrivate->InLoaded_readytoidle = 0; 430 431 pthread_mutex_init(&pComponentPrivate->InIdle_mutex, NULL); 432 pthread_cond_init (&pComponentPrivate->InIdle_threshold, NULL); 433 pComponentPrivate->InIdle_goingtoloaded = 0; 434#else 435 OMX_CreateEvent(&(pComponentPrivate->AlloBuf_event)); 436 pComponentPrivate->AlloBuf_waitingsignal = 0; 437 438 OMX_CreateEvent(&(pComponentPrivate->InLoaded_event)); 439 pComponentPrivate->InLoaded_readytoidle = 0; 440 441 OMX_CreateEvent(&(pComponentPrivate->InIdle_event)); 442 pComponentPrivate->InIdle_goingtoloaded = 0; 443#endif 444 445#ifdef RESOURCE_MANAGER_ENABLED 446 error = RMProxy_NewInitalize(); 447 if (error != OMX_ErrorNone) { 448 G729DEC_DPRINT ("%d ::Error returned from loading ResourceManagerProxy thread\n", 449 __LINE__); 450 goto EXIT; 451 } 452#endif 453 454 error = G729DEC_StartComponentThread(pHandle); 455 if (error != OMX_ErrorNone) { 456 G729DEC_DPRINT ("%d ::Error returned from the Component\n", 457 __LINE__); 458 goto EXIT; 459 } 460 461#ifdef DSP_RENDERING_ON 462 if((pComponentPrivate->fdwrite=open(FIFO1,O_WRONLY))<0) { 463 G729DEC_DPRINT("[G729 Dec Component] - failure to open WRITE pipe\n"); 464 } 465 466 G729DEC_DPRINT ("%d ::OMX_ComponentInit\n", __LINE__); 467 if((pComponentPrivate->fdread=open(FIFO2,O_RDONLY))<0) { 468 G729DEC_DPRINT("[G729 Dec Component] - failure to open READ pipe\n"); 469 goto EXIT; 470 } 471#endif 472 EXIT: 473 G729DEC_DPRINT ("%d ::OMX_ComponentInit - returning %d\n", __LINE__,error); 474 return error; 475} 476 477/*-------------------------------------------------------------------*/ 478/** 479 * SetCallbacks() Sets application callbacks to the component 480 * 481 * This method will update application callbacks 482 * to the component. So that component can make use of those call back 483 * while sending buffers to the application. And also it will copy the 484 * application private data to component memory 485 * 486 * @param pComponent handle for this instance of the component 487 * @param pCallBacks application callbacks 488 * @param pAppData Application private data 489 * 490 * @retval OMX_NoError Success, ready to roll 491 * OMX_Error_BadParameter The input parameter pointer is null 492 **/ 493/*-------------------------------------------------------------------*/ 494 495static OMX_ERRORTYPE SetCallbacks (OMX_HANDLETYPE pComponent, 496 OMX_CALLBACKTYPE* pCallBacks, 497 OMX_PTR pAppData) 498{ 499 OMX_ERRORTYPE eError = OMX_ErrorNone; 500 501 OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE*)pComponent; 502 503 G729DEC_COMPONENT_PRIVATE *pComponentPrivate = 504 (G729DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 505 506 if (pCallBacks == NULL) { 507 G729DEC_DPRINT("About to return OMX_ErrorBadParameter on line %d\n",__LINE__); 508 eError = OMX_ErrorBadParameter; 509 G729DEC_DPRINT ("%d :: Received the empty callbacks from the \ 510 application\n",__LINE__); 511 goto EXIT; 512 } 513 514 /*Copy the callbacks of the application to the component private */ 515 memcpy (&(pComponentPrivate->cbInfo), pCallBacks, sizeof(OMX_CALLBACKTYPE)); 516 517 /*copy the application private data to component memory */ 518 pHandle->pApplicationPrivate = pAppData; 519 520 pComponentPrivate->curState = OMX_StateLoaded; 521 522 EXIT: 523 return eError; 524} 525 526/*-------------------------------------------------------------------*/ 527/** 528 * GetComponentVersion() This will return the component version 529 * 530 * This method will retrun the component version 531 * 532 * @param hComp handle for this instance of the component 533 * @param pCompnentName Name of the component 534 * @param pCompnentVersion handle for this instance of the component 535 * @param pSpecVersion application callbacks 536 * @param pCompnentUUID 537 * 538 * @retval OMX_NoError Success, ready to roll 539 * OMX_Error_BadParameter The input parameter pointer is null 540 **/ 541/*-------------------------------------------------------------------*/ 542 543static OMX_ERRORTYPE GetComponentVersion (OMX_HANDLETYPE hComp, 544 OMX_STRING pComponentName, 545 OMX_VERSIONTYPE* pComponentVersion, 546 OMX_VERSIONTYPE* pSpecVersion, 547 OMX_UUIDTYPE* pComponentUUID) 548{ 549 OMX_ERRORTYPE eError = OMX_ErrorNotImplemented; 550 551 552 G729DEC_DPRINT("Exiting. Returning = 0x%x\n", eError); 553 return eError; 554} 555 556 557/*-------------------------------------------------------------------*/ 558/** 559 * SendCommand() used to send the commands to the component 560 * 561 * This method will be used by the application. 562 * 563 * @param phandle handle for this instance of the component 564 * @param Cmd Command to be sent to the component 565 * @param nParam indicates commmad is sent using this method 566 * 567 * @retval OMX_NoError Success, ready to roll 568 * OMX_Error_BadParameter The input parameter pointer is null 569 **/ 570/*-------------------------------------------------------------------*/ 571 572static OMX_ERRORTYPE SendCommand (OMX_HANDLETYPE phandle, 573 OMX_COMMANDTYPE Cmd, 574 OMX_U32 nParam,OMX_PTR pCmdData) 575{ 576 OMX_ERRORTYPE eError = OMX_ErrorNone; 577 ssize_t nRet = 0; 578 OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)phandle; 579 G729DEC_COMPONENT_PRIVATE *pCompPrivate = 580 (G729DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 581 582 G729DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__); 583#ifdef __PERF_INSTRUMENTATION__ 584 PERF_SendingCommand(pCompPrivate->pPERF, 585 Cmd, 586 (Cmd == OMX_CommandMarkBuffer) ? ((OMX_U32) pCmdData) : nParam, 587 PERF_ModuleComponent); 588#endif 589 590 G729DEC_DPRINT("phandle = %p\n",phandle); 591 G729DEC_DPRINT("pCompPrivate = %p\n",pCompPrivate); 592 593 pCompPrivate->pHandle = phandle; 594 595 596 if(pCompPrivate->curState == OMX_StateInvalid){ 597 G729DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__); 598 eError = OMX_ErrorInvalidState; 599 G729DEC_DPRINT("%d :: G729DEC: Error Notofication \ 600 Sent to App\n",__LINE__); 601 pCompPrivate->cbInfo.EventHandler ( 602 pHandle, pHandle->pApplicationPrivate, 603 OMX_EventError, OMX_ErrorInvalidState,0, 604 "Invalid State"); 605 606 goto EXIT; 607 } 608 609 610 switch(Cmd) { 611 case OMX_CommandStateSet: 612 G729DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__); 613 G729DEC_DPRINT ("%d:::pCompPrivate->curState = %d\n",__LINE__,pCompPrivate->curState); 614 if (nParam == OMX_StateLoaded) { 615 pCompPrivate->bLoadedCommandPending = OMX_TRUE; 616 } 617 if(pCompPrivate->curState == OMX_StateLoaded) { 618 if((nParam == OMX_StateExecuting) || (nParam == OMX_StatePause)) { 619 pCompPrivate->cbInfo.EventHandler ( 620 pHandle, 621 pHandle->pApplicationPrivate, 622 OMX_EventError, 623 OMX_ErrorIncorrectStateTransition, 624 0, 625 NULL); 626 goto EXIT; 627 } 628 629 if(nParam == OMX_StateInvalid) { 630 G729DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__); 631 pCompPrivate->curState = OMX_StateInvalid; 632 pCompPrivate->cbInfo.EventHandler ( 633 pHandle, 634 pHandle->pApplicationPrivate, 635 OMX_EventError, 636 OMX_ErrorInvalidState, 637 0, 638 NULL); 639 goto EXIT; 640 } 641 } 642 break; 643 case OMX_CommandFlush: 644 G729DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__); 645 if(nParam > 1 && nParam != -1) { 646 eError = OMX_ErrorBadPortIndex; 647 goto EXIT; 648 } 649 650 break; 651 case OMX_CommandPortDisable: 652 G729DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__); 653 break; 654 case OMX_CommandPortEnable: 655 G729DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__); 656 break; 657 case OMX_CommandMarkBuffer: 658 G729DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__); 659 if (nParam > 0) { 660 eError = OMX_ErrorBadPortIndex; 661 goto EXIT; 662 } 663 break; 664 default: 665 G729DEC_DPRINT("%d :: G729DEC: Command Received Default \ 666 error\n",__LINE__); 667 pCompPrivate->cbInfo.EventHandler ( 668 pHandle, pHandle->pApplicationPrivate, 669 OMX_EventError, 670 OMX_ErrorUndefined,0, 671 "Invalid Command"); 672 break; 673 674 } 675 676 G729DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__); 677 nRet = write (pCompPrivate->cmdPipe[1], &Cmd, sizeof(Cmd)); 678 if (nRet == -1) { 679 G729DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__); 680 eError = OMX_ErrorInsufficientResources; 681 goto EXIT; 682 } 683 684 if (Cmd == OMX_CommandMarkBuffer) { 685 nRet = write(pCompPrivate->cmdDataPipe[1], &pCmdData, 686 sizeof(OMX_PTR)); 687 } 688 else { 689 nRet = write(pCompPrivate->cmdDataPipe[1], &nParam, 690 sizeof(OMX_U32)); 691 } 692 693 G729DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__); 694 G729DEC_DPRINT ("%d:::nRet = %d\n",__LINE__,nRet); 695 if (nRet == -1) { 696 G729DEC_DPRINT ("%d:::Inside SendCommand\n",__LINE__); 697 eError = OMX_ErrorInsufficientResources; 698 goto EXIT; 699 } 700 701#ifdef DSP_RENDERING_ON 702 if(Cmd == OMX_CommandStateSet && nParam == OMX_StateExecuting) { 703 /* enable Tee device command*/ 704 cmd_data.hComponent = pHandle; 705 cmd_data.AM_Cmd = AM_CommandTDNDownlinkMode; 706 cmd_data.param1 = 0; 707 cmd_data.param2 = 0; 708 cmd_data.streamID = 0; 709 if((write(pCompPrivate->fdwrite, &cmd_data, sizeof(cmd_data)))<0) { 710 eError = OMX_ErrorHardware; 711 goto EXIT; 712 } 713 } 714#endif 715 716 717 EXIT: 718 return eError; 719} 720/*-------------------------------------------------------------------*/ 721/** 722 * GetParameter() Gets the current configurations of the component 723 * 724 * @param hComp handle for this instance of the component 725 * @param nParamIndex 726 * @param ComponentParameterStructure 727 * 728 * @retval OMX_NoError Success, ready to roll 729 * OMX_Error_BadParameter The input parameter pointer is null 730 **/ 731/*-------------------------------------------------------------------*/ 732 733static OMX_ERRORTYPE GetParameter (OMX_HANDLETYPE hComp, 734 OMX_INDEXTYPE nParamIndex, 735 OMX_PTR ComponentParameterStructure) 736{ 737 738 OMX_ERRORTYPE eError = OMX_ErrorNone; 739 G729DEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 740 OMX_PARAM_PORTDEFINITIONTYPE *pParameterStructure = NULL; 741 /* OMX_PARAM_BUFFERSUPPLIERTYPE *pBufferSupplier = NULL; */ 742 743 G729DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__); 744 745 G729DEC_DPRINT("%d :: Inside the GetParameter:: %x\n",__LINE__,nParamIndex); 746 747 pComponentPrivate = (G729DEC_COMPONENT_PRIVATE *)(((OMX_COMPONENTTYPE*)hComp)->pComponentPrivate); 748 pParameterStructure = (OMX_PARAM_PORTDEFINITIONTYPE*)ComponentParameterStructure; 749 750 if (pParameterStructure == NULL) { 751 eError = OMX_ErrorBadParameter; 752 goto EXIT; 753 754 } 755 G729DEC_DPRINT("pParameterStructure = %p\n",pParameterStructure); 756 757 758 G729DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__); 759 if(pComponentPrivate->curState == OMX_StateInvalid) { 760 pComponentPrivate->cbInfo.EventHandler( 761 hComp, 762 ((OMX_COMPONENTTYPE *)hComp)->pApplicationPrivate, 763 OMX_EventError, 764 OMX_ErrorIncorrectStateOperation, 765 0, 766 NULL); 767 G729DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__); 768 } 769 G729DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__); 770 switch(nParamIndex){ 771 772 case OMX_IndexParamAudioInit: 773 G729DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__); 774 G729DEC_DPRINT ("OMX_IndexParamAudioInit\n"); 775 memcpy(ComponentParameterStructure, &pComponentPrivate->sPortParam, sizeof(OMX_PORT_PARAM_TYPE)); 776 break; 777 778 case OMX_IndexParamPortDefinition: 779 G729DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__); 780 G729DEC_DPRINT ("pParameterStructure->nPortIndex = %d\n",pParameterStructure->nPortIndex); 781 G729DEC_DPRINT ("pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->nPortIndex = %d\n",pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->nPortIndex); 782 if(((OMX_PARAM_PORTDEFINITIONTYPE *)(ComponentParameterStructure))->nPortIndex == 783 pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->nPortIndex) { 784 G729DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__); 785 786 memcpy(ComponentParameterStructure, 787 pComponentPrivate->pPortDef[G729DEC_INPUT_PORT], 788 sizeof(OMX_PARAM_PORTDEFINITIONTYPE) 789 ); 790 G729DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__); 791 792 } else if(((OMX_PARAM_PORTDEFINITIONTYPE *)(ComponentParameterStructure))->nPortIndex == 793 pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->nPortIndex) { 794 G729DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__); 795 796 memcpy(ComponentParameterStructure, 797 pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT], 798 sizeof(OMX_PARAM_PORTDEFINITIONTYPE) 799 ); 800 G729DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__); 801 802 } else { 803 G729DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__); 804 805 eError = OMX_ErrorBadPortIndex; 806 } 807 break; 808 809 case OMX_IndexParamAudioPortFormat: 810 G729DEC_DPRINT ("((OMX_AUDIO_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nPortIndex = %d\n",((OMX_AUDIO_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nPortIndex); 811 G729DEC_DPRINT ("pComponentPrivate->pInPortFormat.nPortIndex= %d\n",pComponentPrivate->pInPortFormat->nPortIndex); 812 G729DEC_DPRINT ("pComponentPrivate->pOutPortFormat.nPortIndex= %d\n",pComponentPrivate->pOutPortFormat->nPortIndex); 813 if(((OMX_AUDIO_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nPortIndex == 814 pComponentPrivate->pInPortFormat->nPortIndex) { 815 if(((OMX_AUDIO_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nPortIndex > 816 pComponentPrivate->pInPortFormat->nPortIndex){ 817 eError = OMX_ErrorNoMore; 818 } 819 else{ 820 memcpy(ComponentParameterStructure, pComponentPrivate->pInPortFormat, 821 sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE)); 822 } 823 } 824 else if(((OMX_AUDIO_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nPortIndex == 825 pComponentPrivate->pOutPortFormat->nPortIndex){ 826 if(((OMX_AUDIO_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nPortIndex > 827 pComponentPrivate->pInPortFormat->nPortIndex){ 828 eError = OMX_ErrorNoMore; 829 } 830 else{ 831 memcpy(ComponentParameterStructure, pComponentPrivate->pOutPortFormat, 832 sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE)); 833 } 834 } 835 else { 836 G729DEC_DPRINT ("Inside the GetParameter Line %d\n",__LINE__); 837 eError = OMX_ErrorBadPortIndex; 838 } 839 break; 840 841 case OMX_IndexParamAudioG729: 842 G729DEC_DPRINT("%d :: GetParameter OMX_IndexParamAudioG729 \n",__LINE__); 843 if(((OMX_AUDIO_PARAM_G729TYPE *)(ComponentParameterStructure))->nPortIndex == 844 pComponentPrivate->g729Params->nPortIndex) { 845 memcpy(ComponentParameterStructure, 846 pComponentPrivate->g729Params, 847 sizeof(OMX_AUDIO_PARAM_G729TYPE)); 848 } 849 else { 850 G729DEC_DPRINT("%d :: OMX_ErrorBadPortIndex from GetParameter \n",__LINE__); 851 eError = OMX_ErrorBadPortIndex; 852 } 853 break; 854 855 case OMX_IndexParamAudioPcm: 856 if(((OMX_AUDIO_PARAM_PCMMODETYPE *)(ComponentParameterStructure))->nPortIndex == 857 pComponentPrivate->pcmParams->nPortIndex) { 858 859 memcpy(ComponentParameterStructure, 860 pComponentPrivate->pcmParams, 861 sizeof(OMX_AUDIO_PARAM_PCMMODETYPE)); 862 } 863 else { 864 G729DEC_DPRINT("%d :: OMX_ErrorBadPortIndex from GetParameter \n",__LINE__); 865 eError = OMX_ErrorBadPortIndex; 866 } 867 break; 868 869 case OMX_IndexParamPriorityMgmt: 870 if (pComponentPrivate->sPriorityMgmt == NULL) { 871 eError = OMX_ErrorBadParameter; 872 goto EXIT; 873 } 874 memcpy(ComponentParameterStructure, pComponentPrivate->sPriorityMgmt, sizeof(OMX_PRIORITYMGMTTYPE)); 875 break; 876 877 case OMX_IndexParamCompBufferSupplier: 878 if(((OMX_PARAM_BUFFERSUPPLIERTYPE *)(ComponentParameterStructure))->nPortIndex == OMX_DirInput) { 879 G729DEC_DPRINT(":: GetParameter OMX_IndexParamCompBufferSupplier \n"); 880 /* memcpy(ComponentParameterStructure, pBufferSupplier, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE)); */ 881 } 882 else 883 if(((OMX_PARAM_BUFFERSUPPLIERTYPE *)(ComponentParameterStructure))->nPortIndex == OMX_DirOutput) { 884 G729DEC_DPRINT(":: GetParameter OMX_IndexParamCompBufferSupplier \n"); 885 /*memcpy(ComponentParameterStructure, pBufferSupplier, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE)); */ 886 } 887 else { 888 G729DEC_DPRINT(":: OMX_ErrorBadPortIndex from GetParameter"); 889 eError = OMX_ErrorBadPortIndex; 890 } 891 break; 892 893 case OMX_IndexParamVideoInit: 894 break; 895 896 case OMX_IndexParamImageInit: 897 break; 898 899 case OMX_IndexParamOtherInit: 900 break; 901 902 default: 903 eError = OMX_ErrorUnsupportedIndex; 904 break; 905 } 906 EXIT: 907 G729DEC_DPRINT("%d :: Exiting GetParameter:: %x\n",__LINE__,nParamIndex); 908 return eError; 909} 910 911/*-------------------------------------------------------------------*/ 912/** 913 * SetParameter() Sets configuration paramets to the component 914 * 915 * @param hComp handle for this instance of the component 916 * @param nParamIndex 917 * @param pCompParam 918 * 919 * @retval OMX_NoError Success, ready to roll 920 * OMX_Error_BadParameter The input parameter pointer is null 921 **/ 922/*-------------------------------------------------------------------*/ 923 924static OMX_ERRORTYPE SetParameter (OMX_HANDLETYPE hComp, 925 OMX_INDEXTYPE nParamIndex, 926 OMX_PTR pCompParam) 927{ 928 OMX_ERRORTYPE eError = OMX_ErrorNone; 929 OMX_COMPONENTTYPE* pHandle= (OMX_COMPONENTTYPE*)hComp; 930 G729DEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 931 OMX_AUDIO_PARAM_PCMMODETYPE* pPcmPort = NULL; 932 OMX_PARAM_BUFFERSUPPLIERTYPE *pBufferSupplier = NULL; 933 934 pComponentPrivate = (G729DEC_COMPONENT_PRIVATE *)(((OMX_COMPONENTTYPE*)hComp)->pComponentPrivate); 935 936 if (pCompParam == NULL) { 937 eError = OMX_ErrorBadParameter; 938 goto EXIT; 939 } 940 941 switch(nParamIndex) { 942 case OMX_IndexParamAudioPortFormat: 943 { 944 /* 0 means Input port */ 945 if(pComponentPrivate->pInPortFormat->nPortIndex == ((OMX_AUDIO_PARAM_PORTFORMATTYPE*)pCompParam)->nPortIndex) { 946 memcpy(pComponentPrivate->pInPortFormat, pCompParam, sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE)); 947 } 948 else if (pComponentPrivate->pOutPortFormat->nPortIndex == ((OMX_AUDIO_PARAM_PORTFORMATTYPE*)pCompParam)->nPortIndex) { 949 /* 1 means Output port */ 950 memcpy(pComponentPrivate->pOutPortFormat, pCompParam, sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE)); 951 } 952 else { 953 G729DEC_DPRINT ("%d :: Wrong Port Index Parameter\n", __LINE__); 954 eError = OMX_ErrorBadParameter; 955 goto EXIT; 956 } 957 } 958 break; 959 960 case OMX_IndexParamAudioG729: 961 { 962 OMX_AUDIO_PARAM_G729TYPE *pCompG729Param = 963 (OMX_AUDIO_PARAM_G729TYPE *)pCompParam; 964 if (((G729DEC_COMPONENT_PRIVATE*) 965 pHandle->pComponentPrivate)->g729Params == NULL) { 966 eError = OMX_ErrorBadParameter; 967 goto EXIT; 968 } 969 /* 0 means Input port */ 970 if(pCompG729Param->nPortIndex == 0) { 971 memcpy(((G729DEC_COMPONENT_PRIVATE*) 972 pHandle->pComponentPrivate)->g729Params, 973 pCompG729Param, sizeof(OMX_AUDIO_PARAM_G729TYPE)); 974 } 975 else { 976 eError = OMX_ErrorBadPortIndex; 977 } 978 } 979 break; 980 case OMX_IndexParamPortDefinition: 981 if(((OMX_PARAM_PORTDEFINITIONTYPE *)(pCompParam))->nPortIndex == 982 pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->nPortIndex) { 983 984 memcpy(pComponentPrivate->pPortDef[G729DEC_INPUT_PORT], 985 pCompParam, 986 sizeof(OMX_PARAM_PORTDEFINITIONTYPE) 987 ); 988 989 } 990 else if(((OMX_PARAM_PORTDEFINITIONTYPE *)(pCompParam))->nPortIndex == 991 pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->nPortIndex) { 992 993 memcpy(pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT], 994 pCompParam, 995 sizeof(OMX_PARAM_PORTDEFINITIONTYPE) 996 ); 997 998 } 999 else { 1000 eError = OMX_ErrorBadPortIndex; 1001 } 1002 break; 1003 case OMX_IndexParamPriorityMgmt: 1004 if (pComponentPrivate->curState != OMX_StateLoaded) { 1005 eError = OMX_ErrorIncorrectStateOperation; 1006 goto EXIT; 1007 } 1008 else{ 1009 if (pComponentPrivate->sPriorityMgmt == NULL) { 1010 eError = OMX_ErrorBadParameter; 1011 goto EXIT; 1012 } 1013 1014 memcpy(pComponentPrivate->sPriorityMgmt, (OMX_PRIORITYMGMTTYPE*)pCompParam, sizeof(OMX_PRIORITYMGMTTYPE)); 1015 1016 } 1017 break; 1018 1019 case OMX_IndexParamStandardComponentRole: 1020 /* if (pCompParam) { 1021 pRole = (OMX_PARAM_COMPONENTROLETYPE *)pCompParam; 1022 memcpy(&(pComponentPrivate->componentRole), (void *)pRole, sizeof(OMX_PARAM_COMPONENTROLETYPE)); 1023 } else { 1024 eError = OMX_ErrorBadParameter; 1025 }*/ 1026 eError = OMX_ErrorBadParameter; 1027 break; 1028 1029 case OMX_IndexParamAudioPcm: 1030 if (pComponentPrivate->pcmParams == NULL) { 1031 eError = OMX_ErrorBadParameter; 1032 goto EXIT; 1033 } 1034 if(pCompParam){ 1035 pPcmPort= (OMX_AUDIO_PARAM_PCMMODETYPE *)pCompParam; 1036 memcpy(pComponentPrivate->pcmParams, pPcmPort, sizeof(OMX_AUDIO_PARAM_PCMMODETYPE)); 1037 } 1038 else{ 1039 eError = OMX_ErrorBadParameter; 1040 } 1041 break; 1042 1043 case OMX_IndexParamCompBufferSupplier: 1044 OMX_G729MALLOC_STRUCT(pBufferSupplier, OMX_PARAM_BUFFERSUPPLIERTYPE); 1045 if(((OMX_PARAM_PORTDEFINITIONTYPE *)(pCompParam))->nPortIndex == 1046 pComponentPrivate->pPortDef[OMX_DirInput]->nPortIndex) { 1047 G729DEC_DPRINT(":: SetParameter OMX_IndexParamCompBufferSupplier \n"); 1048 pBufferSupplier->eBufferSupplier = OMX_BufferSupplyInput; 1049 memcpy(pBufferSupplier, pCompParam, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE)); 1050 1051 } 1052 else if(((OMX_PARAM_PORTDEFINITIONTYPE *)(pCompParam))->nPortIndex == 1053 pComponentPrivate->pPortDef[OMX_DirOutput]->nPortIndex) { 1054 G729DEC_DPRINT(":: SetParameter OMX_IndexParamCompBufferSupplier \n"); 1055 pBufferSupplier->eBufferSupplier = OMX_BufferSupplyOutput; 1056 memcpy(pBufferSupplier, pCompParam, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE)); 1057 } 1058 else { 1059 G729DEC_DPRINT(":: OMX_ErrorBadPortIndex from SetParameter"); 1060 eError = OMX_ErrorBadPortIndex; 1061 } 1062 break; 1063 1064 default: 1065 break; 1066 1067 } 1068 EXIT: 1069 return eError; 1070} 1071/*-------------------------------------------------------------------*/ 1072/** 1073 * GetConfig() Gets the current configuration of to the component 1074 * 1075 * @param hComp handle for this instance of the component 1076 * @param nConfigIndex 1077 * @param ComponentConfigStructure 1078 * 1079 * @retval OMX_NoError Success, ready to roll 1080 * OMX_Error_BadParameter The input parameter pointer is null 1081 **/ 1082/*-------------------------------------------------------------------*/ 1083 1084static OMX_ERRORTYPE GetConfig (OMX_HANDLETYPE hComp, 1085 OMX_INDEXTYPE nConfigIndex, 1086 OMX_PTR ComponentConfigStructure) 1087{ 1088 OMX_ERRORTYPE eError = OMX_ErrorNone; 1089 1090 G729DEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 1091 1092 pComponentPrivate = (G729DEC_COMPONENT_PRIVATE *) 1093 (((OMX_COMPONENTTYPE*)hComp)->pComponentPrivate); 1094 1095 if (pComponentPrivate == NULL) 1096 eError = OMX_ErrorBadParameter; 1097 else 1098 memcpy(ComponentConfigStructure,pComponentPrivate,sizeof(G729DEC_COMPONENT_PRIVATE)); 1099 1100 return eError; 1101} 1102/*-------------------------------------------------------------------*/ 1103/** 1104 * SetConfig() Sets the configraiton to the component 1105 * 1106 * @param hComp handle for this instance of the component 1107 * @param nConfigIndex 1108 * @param ComponentConfigStructure 1109 * 1110 * @retval OMX_NoError Success, ready to roll 1111 * OMX_Error_BadParameter The input parameter pointer is null 1112 **/ 1113/*-------------------------------------------------------------------*/ 1114 1115static OMX_ERRORTYPE SetConfig (OMX_HANDLETYPE hComp, 1116 OMX_INDEXTYPE nConfigIndex, 1117 OMX_PTR ComponentConfigStructure) 1118{ 1119 OMX_ERRORTYPE eError = OMX_ErrorNone; 1120 OMX_COMPONENTTYPE* pHandle = (OMX_COMPONENTTYPE*)hComp; 1121 G729DEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 1122 OMX_S16 *customFlag = NULL; 1123 TI_OMX_DSP_DEFINITION *configData = NULL; 1124 1125 OMX_AUDIO_CONFIG_MUTETYPE *pMuteStructure = NULL; 1126 OMX_AUDIO_CONFIG_VOLUMETYPE *pVolumeStructure = NULL; 1127 1128 TI_OMX_DATAPATH dataPath; 1129 1130 1131 G729DEC_DPRINT("%d :: Entering SetConfig\n", __LINE__); 1132 if (pHandle == NULL) { 1133 G729DEC_DPRINT ("%d :: Invalid HANDLE OMX_ErrorBadParameter \n",__LINE__); 1134 eError = OMX_ErrorBadParameter; 1135 goto EXIT; 1136 } 1137 1138 pComponentPrivate = 1139 (G729DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 1140 switch (nConfigIndex) { 1141 case OMX_IndexCustomG729DecHeaderInfoConfig: 1142 { 1143 G729DEC_DPRINT("%d :: SetConfig OMX_IndexCustomNbG729DecHeaderInfoConfig \n",__LINE__); 1144 configData = (TI_OMX_DSP_DEFINITION*)ComponentConfigStructure; 1145 if (configData == NULL) { 1146 eError = OMX_ErrorBadParameter; 1147 G729DEC_DPRINT("%d :: OMX_ErrorBadParameter from SetConfig\n",__LINE__); 1148 goto EXIT; 1149 } 1150 pComponentPrivate->dasfmode = configData->dasfMode; 1151 if(configData->dasfMode == 2){ 1152 pComponentPrivate->dasfmode = 1; 1153 pComponentPrivate->rtmx = 1; 1154 } 1155 pComponentPrivate->acdnmode = configData->acousticMode; 1156 1157 if (pComponentPrivate->dasfmode ){ 1158 pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->bEnabled = 0; 1159 } 1160 1161 G729DEC_DPRINT("pComponentPrivate->acdnmode = %d\n",pComponentPrivate->acdnmode); 1162 G729DEC_DPRINT("pComponentPrivate->dasfmode = %d\n",pComponentPrivate->dasfmode); 1163 1164 pComponentPrivate->streamID = configData->streamId; 1165 break; 1166 } 1167 case OMX_IndexCustomG729DecDataPath: 1168 customFlag = (OMX_S16*)ComponentConfigStructure; 1169 if (customFlag == NULL) { 1170 eError = OMX_ErrorBadParameter; 1171 goto EXIT; 1172 } 1173 1174 dataPath = *customFlag; 1175 1176 switch(dataPath) { 1177 case DATAPATH_APPLICATION: 1178 OMX_MMMIXER_DATAPATH(pComponentPrivate->sDeviceString, 1179 RENDERTYPE_DECODER, pComponentPrivate->streamID); 1180 /* strcpy((char*)pComponentPrivate->sDeviceString,(char*)ETEEDN_STRING); */ 1181 break; 1182 1183 case DATAPATH_APPLICATION_RTMIXER: 1184 strcpy((char*)pComponentPrivate->sDeviceString,(char*)RTM_STRING); 1185 break; 1186 1187 case DATAPATH_ACDN: 1188 strcpy((char*)pComponentPrivate->sDeviceString,(char*)ACDN_STRING); 1189 break; 1190 1191 default: 1192 break; 1193 1194 } 1195 break; 1196 1197 case OMX_IndexCustomG729DecModeDasfConfig: 1198 { 1199 G729DEC_DPRINT("%d :: SetConfig OMX_IndexCustomG729DecModeDasfConfig \n",__LINE__); 1200 customFlag = (OMX_S16*)ComponentConfigStructure; 1201 if (customFlag == NULL) { 1202 eError = OMX_ErrorBadParameter; 1203 G729DEC_DPRINT("%d :: OMX_ErrorBadParameter from SetConfig\n",__LINE__); 1204 goto EXIT; 1205 } 1206 pComponentPrivate->dasfmode = *customFlag; 1207 G729DEC_DPRINT("pComponentPrivate->dasfmode = %d\n",pComponentPrivate->dasfmode); 1208 if (pComponentPrivate->dasfmode ){ 1209 pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->bEnabled = 0; 1210 } 1211 break; 1212 } 1213 case OMX_IndexConfigAudioMute: 1214 { 1215#ifdef DSP_RENDERING_ON 1216 pMuteStructure = (OMX_AUDIO_CONFIG_MUTETYPE *)ComponentConfigStructure; 1217 G729DEC_DPRINT("Set Mute/Unmute for playback stream\n"); 1218 cmd_data.hComponent = hComp; 1219 if(pMuteStructure->bMute == OMX_TRUE) 1220 { 1221 G729DEC_DPRINT("Mute the playback stream\n"); 1222 cmd_data.AM_Cmd = AM_CommandStreamMute; 1223 } 1224 else 1225 { 1226 G729DEC_DPRINT("unMute the playback stream\n"); 1227 cmd_data.AM_Cmd = AM_CommandStreamUnMute; 1228 } 1229 cmd_data.param1 = 0; 1230 cmd_data.param2 = 0; 1231 cmd_data.streamID = pComponentPrivate->streamID; 1232 if((write(pComponentPrivate->fdwrite, &cmd_data, sizeof(cmd_data)))<0) 1233 { 1234 G729DEC_DPRINT("[G729 decoder] - fail to send Mute command to audio manager\n"); 1235 } 1236 1237 break; 1238#endif 1239 } 1240 case OMX_IndexConfigAudioVolume: 1241 { 1242#ifdef DSP_RENDERING_ON 1243 pVolumeStructure = (OMX_AUDIO_CONFIG_VOLUMETYPE *)ComponentConfigStructure; 1244 G729DEC_DPRINT("Set volume for playback stream\n"); 1245 cmd_data.hComponent = hComp; 1246 cmd_data.AM_Cmd = AM_CommandSWGain; 1247 cmd_data.param1 = pVolumeStructure->sVolume.nValue; 1248 cmd_data.param2 = 0; 1249 cmd_data.streamID = pComponentPrivate->streamID; 1250 1251 if((write(pComponentPrivate->fdwrite, &cmd_data, sizeof(cmd_data)))<0) 1252 { 1253 G729DEC_DPRINT("[G729 decoder] - fail to send Volume command to audio manager\n"); 1254 } 1255 1256 break; 1257#endif 1258 } 1259 default: 1260 eError = OMX_ErrorUnsupportedIndex; 1261 break; 1262 } 1263 EXIT: 1264 G729DEC_DPRINT("%d :: Exiting SetConfig\n", __LINE__); 1265 G729DEC_DPRINT("%d :: Returning = 0x%x\n",__LINE__,eError); 1266 return eError; 1267 1268} 1269/*-------------------------------------------------------------------*/ 1270/** 1271 * GetState() Gets the current state of the component 1272 * 1273 * @param pCompomponent handle for this instance of the component 1274 * @param pState 1275 * 1276 * @retval OMX_NoError Success, ready to roll 1277 * OMX_Error_BadParameter The input parameter pointer is null 1278 **/ 1279/*-------------------------------------------------------------------*/ 1280 1281static OMX_ERRORTYPE GetState (OMX_HANDLETYPE pComponent, OMX_STATETYPE* pState) 1282{ 1283 OMX_ERRORTYPE error = OMX_ErrorUndefined; 1284 OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent; 1285 1286 if (!pState) { 1287 error = OMX_ErrorBadParameter; 1288 G729DEC_DPRINT("About to return OMX_ErrorBadParameter on line %d\n",__LINE__); 1289 goto EXIT; 1290 } 1291 1292 if (pHandle && pHandle->pComponentPrivate) { 1293 *pState = ((G729DEC_COMPONENT_PRIVATE*) 1294 pHandle->pComponentPrivate)->curState; 1295 } else { 1296 *pState = OMX_StateLoaded; 1297 } 1298 1299 error = OMX_ErrorNone; 1300 1301 EXIT: 1302 return error; 1303} 1304 1305/*-------------------------------------------------------------------*/ 1306/** 1307 * EmptyThisBuffer() This callback is used to send the input buffer to 1308 * component 1309 * 1310 * @param pComponent handle for this instance of the component 1311 * @param nPortIndex input port index 1312 * @param pBuffer buffer to be sent to codec 1313 * 1314 * @retval OMX_NoError Success, ready to roll 1315 * OMX_Error_BadParameter The input parameter pointer is null 1316 **/ 1317/*-------------------------------------------------------------------*/ 1318 1319static OMX_ERRORTYPE EmptyThisBuffer (OMX_HANDLETYPE pComponent, 1320 OMX_BUFFERHEADERTYPE* pBuffer) 1321{ 1322 OMX_ERRORTYPE eError = OMX_ErrorNone; 1323 OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent; 1324 G729DEC_COMPONENT_PRIVATE *pComponentPrivate = 1325 (G729DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 1326 OMX_PARAM_PORTDEFINITIONTYPE *pPortDef = NULL; 1327 ssize_t ret = 0; 1328 1329#ifdef __PERF_INSTRUMENTATION__ 1330 PERF_ReceivedFrame(pComponentPrivate->pPERF, 1331 pBuffer->pBuffer, 1332 pBuffer->nFilledLen, 1333 PERF_ModuleHLMM); 1334#endif 1335 1336 pPortDef = ((G729DEC_COMPONENT_PRIVATE*) 1337 pComponentPrivate)->pPortDef[G729DEC_INPUT_PORT]; 1338 if(!pPortDef->bEnabled) { 1339 G729DEC_DPRINT("About to return OMX_ErrorIncorrectStateOperation Line %d\n",__LINE__); 1340 eError = OMX_ErrorIncorrectStateOperation; 1341 goto EXIT; 1342 } 1343 if (pBuffer == NULL) { 1344 eError = OMX_ErrorBadParameter; 1345 G729DEC_DPRINT("About to return OMX_ErrorBadParameter on line %d\n",__LINE__); 1346 goto EXIT; 1347 } 1348 if (pBuffer->nSize != sizeof(OMX_BUFFERHEADERTYPE)) { 1349 eError = OMX_ErrorBadParameter; 1350 goto EXIT; 1351 } 1352 if (pBuffer->nVersion.nVersion != pComponentPrivate->nVersion) { 1353 eError = OMX_ErrorVersionMismatch; 1354 goto EXIT; 1355 } 1356 if (pBuffer->nInputPortIndex != G729DEC_INPUT_PORT) { 1357 eError = OMX_ErrorBadPortIndex; 1358 goto EXIT; 1359 } 1360 if(pComponentPrivate->curState != OMX_StateExecuting && 1361 pComponentPrivate->curState != OMX_StatePause) 1362 { 1363 G729DEC_DPRINT("About to return OMX_ErrorIncorrectStateOperation Line %d\n",__LINE__); 1364 eError = OMX_ErrorIncorrectStateOperation; 1365 goto EXIT; 1366 } 1367 G729DEC_DPRINT("\n------------------------------------------\n\n"); 1368 G729DEC_DPRINT ("%d :: Component Sending Filled ip buff %p \ 1369 to Component Thread\n",__LINE__,pBuffer); 1370 G729DEC_DPRINT("\n------------------------------------------\n\n"); 1371 1372 pComponentPrivate->app_nBuf--; 1373 pComponentPrivate->pMarkData = pBuffer->pMarkData; 1374 pComponentPrivate->hMarkTargetComponent = pBuffer->hMarkTargetComponent; 1375 pComponentPrivate->nUnhandledEmptyThisBuffers++; 1376 ret = write (pComponentPrivate->dataPipe[1], &pBuffer, 1377 sizeof(OMX_BUFFERHEADERTYPE*)); 1378 if (ret == -1) { 1379 G729DEC_DPRINT ("%d :: Error in Writing to the Data pipe\n", __LINE__); 1380 eError = OMX_ErrorHardware; 1381 goto EXIT; 1382 } 1383 pComponentPrivate->nEmptyThisBufferCount++; 1384 EXIT: 1385 G729DEC_DPRINT("Exiting EmptyThisBuffer()\n"); 1386 return eError; 1387} 1388/*-------------------------------------------------------------------*/ 1389/** 1390 * FillThisBuffer() This callback is used to send the output buffer to 1391 * the component 1392 * 1393 * @param pComponent handle for this instance of the component 1394 * @param nPortIndex output port number 1395 * @param pBuffer buffer to be sent to codec 1396 * 1397 * @retval OMX_NoError Success, ready to roll 1398 * OMX_Error_BadParameter The input parameter pointer is null 1399 **/ 1400/*-------------------------------------------------------------------*/ 1401 1402static OMX_ERRORTYPE FillThisBuffer (OMX_HANDLETYPE pComponent, 1403 OMX_BUFFERHEADERTYPE* pBuffer) 1404{ 1405 OMX_ERRORTYPE eError = OMX_ErrorNone; 1406 OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent; 1407 G729DEC_COMPONENT_PRIVATE *pComponentPrivate = 1408 (G729DEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 1409 OMX_PARAM_PORTDEFINITIONTYPE *pPortDef = NULL; 1410 1411#ifdef __PERF_INSTRUMENTATION__ 1412 PERF_ReceivedFrame(pComponentPrivate->pPERF, 1413 pBuffer->pBuffer, 1414 0, 1415 PERF_ModuleHLMM); 1416#endif 1417 1418 G729DEC_DPRINT("\n------------------------------------------\n\n"); 1419 G729DEC_DPRINT ("%d :: Component Sending Emptied op buff %p \ 1420 to Component Thread\n",__LINE__,pBuffer); 1421 G729DEC_DPRINT("\n------------------------------------------\n\n"); 1422 pPortDef = ((G729DEC_COMPONENT_PRIVATE*) 1423 pComponentPrivate)->pPortDef[G729DEC_OUTPUT_PORT]; 1424 if(!pPortDef->bEnabled) { 1425 G729DEC_DPRINT("About to return OMX_ErrorIncorrectStateOperation Line %d\n",__LINE__); 1426 eError = OMX_ErrorIncorrectStateOperation; 1427 goto EXIT; 1428 } 1429 if (pBuffer == NULL) { 1430 eError = OMX_ErrorBadParameter; 1431 G729DEC_DPRINT("About to return OMX_ErrorBadParameter on line %d\n",__LINE__); 1432 goto EXIT; 1433 } 1434 if (pBuffer->nSize != sizeof(OMX_BUFFERHEADERTYPE)) { 1435 eError = OMX_ErrorBadParameter; 1436 goto EXIT; 1437 } 1438 if (pBuffer->nVersion.nVersion != pComponentPrivate->nVersion) { 1439 eError = OMX_ErrorVersionMismatch; 1440 goto EXIT; 1441 } 1442 if (pBuffer->nOutputPortIndex != G729DEC_OUTPUT_PORT) { 1443 eError = OMX_ErrorBadPortIndex; 1444 goto EXIT; 1445 } 1446 if (pComponentPrivate->curState == OMX_StatePause) { 1447 G729DEC_DPRINT("FillThisBuffer called while paused\n"); 1448 } 1449 if(pComponentPrivate->curState != OMX_StateExecuting && pComponentPrivate->curState != OMX_StatePause) { 1450 G729DEC_DPRINT("About to return OMX_ErrorIncorrectStateOperation Line %d\n",__LINE__); 1451 eError = OMX_ErrorIncorrectStateOperation; 1452 goto EXIT; 1453 } 1454 pBuffer->nFilledLen = 0; 1455 /*Filling the Output buffer with zero */ 1456 memset (pBuffer->pBuffer,0,pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->nBufferSize); 1457 pComponentPrivate->app_nBuf--; 1458 G729DEC_DPRINT("%d:Decrementing app_nBuf = %d\n",__LINE__,pComponentPrivate->app_nBuf); 1459 G729DEC_DPRINT("pComponentPrivate->pMarkBuf = 0x%x\n",pComponentPrivate->pMarkBuf); 1460 G729DEC_DPRINT("pComponentPrivate->pMarkData = 0x%x\n",pComponentPrivate->pMarkData); 1461 1462 if(pComponentPrivate->pMarkBuf){ 1463 pBuffer->hMarkTargetComponent = pComponentPrivate->pMarkBuf->hMarkTargetComponent; 1464 pBuffer->pMarkData = pComponentPrivate->pMarkBuf->pMarkData; 1465 pComponentPrivate->pMarkBuf = NULL; 1466 } 1467 if (pComponentPrivate->pMarkData) { 1468 pBuffer->hMarkTargetComponent = pComponentPrivate->hMarkTargetComponent; 1469 pBuffer->pMarkData = pComponentPrivate->pMarkData; 1470 pComponentPrivate->pMarkData = NULL; 1471 } 1472 pComponentPrivate->nUnhandledFillThisBuffers++; 1473 write (pComponentPrivate->dataPipe[1], &pBuffer, 1474 sizeof (OMX_BUFFERHEADERTYPE*)); 1475 pComponentPrivate->nFillThisBufferCount++; 1476 1477 EXIT: 1478 G729DEC_DPRINT("Exiting FillThisBuffer()\n"); 1479 return eError; 1480} 1481/*-------------------------------------------------------------------*/ 1482/** 1483 * OMX_ComponentDeinit() this methold will de init the component 1484 * 1485 * @param pComp handle for this instance of the component 1486 * 1487 * @retval OMX_NoError Success, ready to roll 1488 * OMX_Error_BadParameter The input parameter pointer is null 1489 **/ 1490/*-------------------------------------------------------------------*/ 1491 1492static OMX_ERRORTYPE ComponentDeInit(OMX_HANDLETYPE pHandle) 1493{ 1494 OMX_ERRORTYPE eError = OMX_ErrorNone; 1495 1496 /* inform audio manager to remove the streamID*/ 1497 /* compose the data */ 1498 OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)pHandle; 1499 G729DEC_COMPONENT_PRIVATE *pComponentPrivate = 1500 (G729DEC_COMPONENT_PRIVATE *)pComponent->pComponentPrivate; 1501 1502#ifdef __PERF_INSTRUMENTATION__ 1503 PERF_Boundary(pComponentPrivate->pPERF, 1504 PERF_BoundaryStart | PERF_BoundaryCleanup); 1505#endif 1506 1507 G729DEC_DPRINT ("%d ::ComponentDeInit\n",__LINE__); 1508 1509#ifdef DSP_RENDERING_ON 1510 close(pComponentPrivate->fdwrite); 1511 close(pComponentPrivate->fdread); 1512#endif 1513 1514#ifdef RESOURCE_MANAGER_ENABLED 1515 eError = RMProxy_NewSendCommand(pHandle, RMProxy_FreeResource, OMX_G729_Decoder_COMPONENT, 0, 3456,NULL); 1516 if (eError != OMX_ErrorNone) { 1517 G729DEC_DPRINT ("%d ::OMX_G729Decoder.c :: Error returned from destroy ResourceManagerProxy thread\n", 1518 __LINE__); 1519 } 1520 eError = RMProxy_Deinitalize(); 1521 if (eError != OMX_ErrorNone) { 1522 G729DEC_DPRINT ("%d ::Error returned from destroy ResourceManagerProxy thread\n", 1523 __LINE__); 1524 } 1525#endif 1526 1527 pComponentPrivate->bIsStopping = 1; 1528 eError = G729DEC_StopComponentThread(pHandle); 1529 /* Wait for thread to exit so we can get the status into "error" */ 1530 1531#ifndef UNDER_CE 1532 pthread_mutex_destroy(&pComponentPrivate->InLoaded_mutex); 1533 pthread_cond_destroy(&pComponentPrivate->InLoaded_threshold); 1534 1535 pthread_mutex_destroy(&pComponentPrivate->InIdle_mutex); 1536 pthread_cond_destroy(&pComponentPrivate->InIdle_threshold); 1537 1538 pthread_mutex_destroy(&pComponentPrivate->AlloBuf_mutex); 1539 pthread_cond_destroy(&pComponentPrivate->AlloBuf_threshold); 1540#else 1541 OMX_DestroyEvent(&(pComponentPrivate->InLoaded_event)); 1542 OMX_DestroyEvent(&(pComponentPrivate->InIdle_event)); 1543 OMX_DestroyEvent(&(pComponentPrivate->AlloBuf_event)); 1544#endif 1545 1546 /* close the pipe handles */ 1547 G729DEC_FreeCompResources(pHandle); 1548 G729DEC_DPRINT ("%d ::After G729DEC_FreeCompResources\n",__LINE__); 1549 1550#ifdef __PERF_INSTRUMENTATION__ 1551 PERF_Boundary(pComponentPrivate->pPERF, 1552 PERF_BoundaryComplete | PERF_BoundaryCleanup); 1553 PERF_Done(pComponentPrivate->pPERF); 1554#endif 1555 1556 OMX_G729MEMFREE_STRUCT(pComponentPrivate->sDeviceString); 1557 OMX_G729MEMFREE_STRUCT(pComponentPrivate->pInputBufferList); 1558 OMX_G729MEMFREE_STRUCT(pComponentPrivate->pOutputBufferList); 1559 OMX_G729MEMFREE_STRUCT(pComponentPrivate->g729Params); 1560 OMX_G729MEMFREE_STRUCT(pComponentPrivate->pcmParams); 1561 OMX_G729MEMFREE_STRUCT(pComponentPrivate->sPriorityMgmt); 1562 OMX_G729MEMFREE_STRUCT(pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]); 1563 OMX_G729MEMFREE_STRUCT(pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]); 1564 OMX_G729MEMFREE_STRUCT(pComponentPrivate->pInPortFormat); 1565 OMX_G729MEMFREE_STRUCT(pComponentPrivate->pOutPortFormat); 1566 1567 OMX_G729MEMFREE_STRUCT(pComponentPrivate); 1568 G729DEC_DPRINT ("%d ::After free(pComponentPrivate)\n",__LINE__); 1569 1570 return eError; 1571} 1572 1573/*-------------------------------------------------------------------*/ 1574/** 1575 * ComponentTunnelRequest() this method is not implemented in 1.5 1576 * 1577 * This method will update application callbacks 1578 * the application. 1579 * 1580 * @param pComp handle for this instance of the component 1581 * @param pCallBacks application callbacks 1582 * @param ptr 1583 * 1584 * @retval OMX_NoError Success, ready to roll 1585 * OMX_Error_BadParameter The input parameter pointer is null 1586 **/ 1587/*-------------------------------------------------------------------*/ 1588 1589static OMX_ERRORTYPE ComponentTunnelRequest (OMX_HANDLETYPE hComp, 1590 OMX_U32 nPort, OMX_HANDLETYPE hTunneledComp, 1591 OMX_U32 nTunneledPort, 1592 OMX_TUNNELSETUPTYPE* pTunnelSetup) 1593{ 1594 OMX_ERRORTYPE eError = OMX_ErrorNotImplemented; 1595 1596 G729DEC_DPRINT (stderr, "Inside the ComponentTunnelRequest\n"); 1597 1598 return eError; 1599} 1600 1601/*-------------------------------------------------------------------*/ 1602/** 1603 * AllocateBuffer() 1604 1605 * @param pComp handle for this instance of the component 1606 * @param pCallBacks application callbacks 1607 * @param ptr 1608 * 1609 * @retval OMX_NoError Success, ready to roll 1610 * OMX_Error_BadParameter The input parameter pointer is null 1611 **/ 1612/*-------------------------------------------------------------------*/ 1613 1614static OMX_ERRORTYPE AllocateBuffer (OMX_IN OMX_HANDLETYPE hComponent, 1615 OMX_INOUT OMX_BUFFERHEADERTYPE** pBuffer, 1616 OMX_IN OMX_U32 nPortIndex, 1617 OMX_IN OMX_PTR pAppPrivate, 1618 OMX_IN OMX_U32 nSizeBytes) 1619 1620{ 1621 OMX_PARAM_PORTDEFINITIONTYPE *pPortDef = NULL; 1622 G729DEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 1623 OMX_ERRORTYPE eError = OMX_ErrorNone; 1624 OMX_BUFFERHEADERTYPE *pBufferHeader = NULL; 1625 1626 pComponentPrivate = (G729DEC_COMPONENT_PRIVATE *) 1627 (((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate); 1628 1629 pPortDef = ((G729DEC_COMPONENT_PRIVATE*) 1630 pComponentPrivate)->pPortDef[nPortIndex]; 1631 G729DEC_DPRINT ("%d :: pPortDef = 0x%x\n", __LINE__,pPortDef); 1632 G729DEC_DPRINT ("%d :: pPortDef->bEnabled = %d\n", __LINE__,pPortDef->bEnabled); 1633 1634 G729DEC_DPRINT ("pPortDef->bEnabled = %d\n", pPortDef->bEnabled); 1635 if(!(pPortDef->bEnabled)) 1636 { 1637 pComponentPrivate->AlloBuf_waitingsignal = 1; 1638 1639#ifndef UNDER_CE 1640 pthread_mutex_lock(&pComponentPrivate->AlloBuf_mutex); 1641 pthread_cond_wait(&pComponentPrivate->AlloBuf_threshold, &pComponentPrivate->AlloBuf_mutex); 1642 pthread_mutex_unlock(&pComponentPrivate->AlloBuf_mutex); 1643#else 1644 OMX_WaitForEvent(&(pComponentPrivate->AlloBuf_event)); 1645#endif 1646 1647 } 1648 OMX_G729MALLOC_STRUCT(pBufferHeader, OMX_BUFFERHEADERTYPE); 1649 pBufferHeader->pBuffer = (OMX_U8 *)malloc(nSizeBytes + EXTRA_BUFFBYTES); 1650 memset(pBufferHeader->pBuffer, 0x0, nSizeBytes + EXTRA_BUFFBYTES); 1651 G729DEC_MEMPRINT("%d :: [ALLOC] %p\n",__LINE__,pBufferHeader->pBuffer); 1652 1653 if (pBufferHeader->pBuffer == NULL) { 1654 /* Free previously allocated memory before bailing */ 1655 if (pBufferHeader) { 1656 free(pBufferHeader); 1657 pBufferHeader = NULL; 1658 } 1659 eError = OMX_ErrorInsufficientResources; 1660 goto EXIT; 1661 } 1662 1663 pBufferHeader->pBuffer += CACHE_ALIGNMENT; 1664 1665 if (nPortIndex == G729DEC_INPUT_PORT) { 1666 pBufferHeader->nInputPortIndex = nPortIndex; 1667 pBufferHeader->nOutputPortIndex = -1; 1668 pComponentPrivate->pInputBufferList->pBufHdr[pComponentPrivate->pInputBufferList->numBuffers] = pBufferHeader; 1669 pComponentPrivate->pInputBufferList->bBufferPending[pComponentPrivate->pInputBufferList->numBuffers] = 0; 1670 G729DEC_DPRINT("pComponentPrivate->pInputBufferList->pBufHdr[%d] = %p\n",pComponentPrivate->pInputBufferList->numBuffers,pComponentPrivate->pInputBufferList->pBufHdr[pComponentPrivate->pInputBufferList->numBuffers]); 1671 pComponentPrivate->pInputBufferList->bufferOwner[pComponentPrivate->pInputBufferList->numBuffers++] = 1; 1672 if (pComponentPrivate->pInputBufferList->numBuffers == pPortDef->nBufferCountActual) { 1673 G729DEC_DPRINT("Setting pPortDef->bPopulated = OMX_TRUE for input port\n"); 1674 pPortDef->bPopulated = OMX_TRUE; 1675 } 1676 } 1677 else if (nPortIndex == G729DEC_OUTPUT_PORT) { 1678 pBufferHeader->nInputPortIndex = -1; 1679 pBufferHeader->nOutputPortIndex = nPortIndex; 1680 pComponentPrivate->pOutputBufferList->pBufHdr[pComponentPrivate->pOutputBufferList->numBuffers] = pBufferHeader; 1681 pComponentPrivate->pOutputBufferList->bBufferPending[pComponentPrivate->pOutputBufferList->numBuffers] = 0; 1682 pComponentPrivate->pOutputBufferList->bufferOwner[pComponentPrivate->pOutputBufferList->numBuffers++] = 1; 1683 if (pComponentPrivate->pOutputBufferList->numBuffers == pPortDef->nBufferCountActual) { 1684 G729DEC_DPRINT("Setting pPortDef->bPopulated = OMX_TRUE for input port\n"); 1685 pPortDef->bPopulated = OMX_TRUE; 1686 } 1687 } 1688 else { 1689 eError = OMX_ErrorBadPortIndex; 1690 goto EXIT; 1691 } 1692 1693 if((pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->bPopulated == pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->bEnabled)&& 1694 (pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->bPopulated == pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->bEnabled) && 1695 (pComponentPrivate->InLoaded_readytoidle)) 1696 { 1697 pComponentPrivate->InLoaded_readytoidle = 0; 1698 1699#ifndef UNDER_CE 1700 pthread_mutex_lock(&pComponentPrivate->InLoaded_mutex); 1701 pthread_cond_signal(&pComponentPrivate->InLoaded_threshold); 1702 pthread_mutex_unlock(&pComponentPrivate->InLoaded_mutex); 1703#else 1704 OMX_SignalEvent(&(pComponentPrivate->InLoaded_event)); 1705#endif 1706 1707 } 1708 pBufferHeader->pAppPrivate = pAppPrivate; 1709 OMX_G729MALLOC_STRUCT(pBufferHeader->pInputPortPrivate, G729DEC_BufParamStruct); 1710 ((G729DEC_BufParamStruct*)pBufferHeader->pInputPortPrivate)->bNoUseDefaults = OMX_FALSE; /* setting a flag to use defaults until client says otherwise */ 1711 pBufferHeader->pPlatformPrivate = pComponentPrivate; 1712 pBufferHeader->nAllocLen = nSizeBytes; 1713 pBufferHeader->nVersion.s.nVersionMajor = G729DEC_MAJOR_VER; 1714 pBufferHeader->nVersion.s.nVersionMinor = G729DEC_MINOR_VER; 1715 pComponentPrivate->nVersion = pBufferHeader->nVersion.nVersion; 1716 pBufferHeader->nSize = sizeof(OMX_BUFFERHEADERTYPE); 1717 *pBuffer = pBufferHeader; 1718 1719#ifdef __PERF_INSTRUMENTATION__ 1720 PERF_ReceivedBuffer(pComponentPrivate->pPERF, 1721 (*pBuffer)->pBuffer, nSizeBytes, 1722 PERF_ModuleMemory); 1723#endif 1724 1725 if (pComponentPrivate->bEnableCommandPending && pPortDef->bPopulated) { 1726 SendCommand (pComponentPrivate->pHandle, 1727 OMX_CommandPortEnable, 1728 pComponentPrivate->bEnableCommandParam,NULL); 1729 } 1730 1731 EXIT: 1732 G729DEC_DPRINT("AllocateBuffer returning %d\n",eError); 1733 return eError; 1734} 1735 1736 1737/*-------------------------------------------------------------------*/ 1738/** 1739 * FreeBuffer() 1740 1741 * @param hComponent handle for this instance of the component 1742 * @param pCallBacks application callbacks 1743 * @param ptr 1744 * 1745 * @retval OMX_NoError Success, ready to roll 1746 * OMX_Error_BadParameter The input parameter pointer is null 1747 **/ 1748/*-------------------------------------------------------------------*/ 1749static OMX_ERRORTYPE FreeBuffer( 1750 OMX_IN OMX_HANDLETYPE hComponent, 1751 OMX_IN OMX_U32 nPortIndex, 1752 OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) 1753{ 1754 1755 OMX_ERRORTYPE eError = OMX_ErrorNone; 1756 G729DEC_COMPONENT_PRIVATE * pComponentPrivate = NULL; 1757 OMX_BUFFERHEADERTYPE* buff = NULL; 1758 OMX_U8* tempBuff = NULL; 1759 OMX_S16 i =0; 1760 OMX_S16 inputIndex = -1; 1761 OMX_S16 outputIndex = -1; 1762 OMX_COMPONENTTYPE *pHandle = NULL; 1763 1764 1765 pComponentPrivate = (G729DEC_COMPONENT_PRIVATE *) 1766 (((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate); 1767 pHandle = (OMX_COMPONENTTYPE *) pComponentPrivate->pHandle; 1768 G729DEC_DPRINT("Entering FreeBuffer\n"); 1769 if (nPortIndex == G729DEC_INPUT_PORT){ 1770 for (i=0; i < MAX_NUM_OF_BUFS; i++) 1771 { 1772 buff = pComponentPrivate->pInputBufferList->pBufHdr[i]; 1773 if (buff == pBuffer) 1774 { 1775 G729DEC_DPRINT("Found matching input buffer\n"); 1776 G729DEC_DPRINT("buff = %p\n", buff); 1777 G729DEC_DPRINT("pBuffer = %p\n", pBuffer); 1778 inputIndex = i; 1779 break; 1780 } 1781 else 1782 { 1783 G729DEC_DPRINT("This is not a match\n"); 1784 G729DEC_DPRINT("buff = %p\n", buff); 1785 G729DEC_DPRINT("pBuffer = %p\n", pBuffer); 1786 } 1787 } 1788 } 1789 else if (nPortIndex == G729DEC_OUTPUT_PORT){ 1790 for (i=0; i < MAX_NUM_OF_BUFS; i++) 1791 { 1792 buff = pComponentPrivate->pOutputBufferList->pBufHdr[i]; 1793 if (buff == pBuffer) 1794 { 1795 G729DEC_DPRINT("Found matching output buffer\n"); 1796 G729DEC_DPRINT("buff = %p\n", buff); 1797 G729DEC_DPRINT("pBuffer = %p\n", pBuffer); 1798 outputIndex = i; 1799 break; 1800 } 1801 else 1802 { 1803 G729DEC_DPRINT("This is not a match\n"); 1804 G729DEC_DPRINT("buff = %p\n", buff); 1805 G729DEC_DPRINT("pBuffer = %p\n", pBuffer); 1806 } 1807 } 1808 } 1809 if (inputIndex != -1) 1810 { 1811 if (pComponentPrivate->pInputBufferList->bufferOwner[inputIndex] == 1) 1812 { 1813#ifdef __PERF_INSTRUMENTATION__ 1814 PERF_SendingBuffer(pComponentPrivate->pPERF, 1815 pComponentPrivate->pInputBufferList->pBufHdr[inputIndex]->pBuffer, 1816 pComponentPrivate->pInputBufferList->pBufHdr[inputIndex]->nAllocLen, 1817 PERF_ModuleMemory ); 1818#endif 1819 tempBuff = pComponentPrivate->pInputBufferList->pBufHdr[inputIndex]->pBuffer; 1820 if (tempBuff != NULL) 1821 { 1822 tempBuff -= CACHE_ALIGNMENT; 1823 OMX_G729MEMFREE_STRUCT(tempBuff); 1824 } 1825 OMX_G729MEMFREE_STRUCT(pComponentPrivate->pInputBufferList->pBufHdr[inputIndex]->pInputPortPrivate); 1826 } 1827 OMX_G729MEMFREE_STRUCT(pComponentPrivate->pInputBufferList->pBufHdr[inputIndex]); 1828 pComponentPrivate->pInputBufferList->numBuffers--; 1829 if (pComponentPrivate->pInputBufferList->numBuffers < 1830 pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->nBufferCountMin) 1831 { 1832 pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->bPopulated = OMX_FALSE; 1833 } 1834 if(pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->bEnabled && 1835 pComponentPrivate->bLoadedCommandPending == OMX_FALSE && 1836 (pComponentPrivate->curState == OMX_StateIdle || 1837 pComponentPrivate->curState == OMX_StateExecuting || 1838 pComponentPrivate->curState == OMX_StatePause)) 1839 { 1840 pComponentPrivate->cbInfo.EventHandler( pHandle, 1841 pHandle->pApplicationPrivate, 1842 OMX_EventError, 1843 OMX_ErrorPortUnpopulated, 1844 nPortIndex, 1845 NULL); 1846 } 1847 } 1848 else if (outputIndex != -1) 1849 { 1850 if (pComponentPrivate->pOutputBufferList->bufferOwner[outputIndex] == 1) { 1851#ifdef __PERF_INSTRUMENTATION__ 1852 PERF_SendingBuffer(pComponentPrivate->pPERF, 1853 pComponentPrivate->pOutputBufferList->pBufHdr[outputIndex]->pBuffer, 1854 pComponentPrivate->pOutputBufferList->pBufHdr[outputIndex]->nAllocLen, 1855 PERF_ModuleMemory ); 1856#endif 1857 tempBuff = pComponentPrivate->pOutputBufferList->pBufHdr[outputIndex]->pBuffer; 1858 if (tempBuff != NULL) 1859 { 1860 tempBuff -= CACHE_ALIGNMENT; 1861 OMX_G729MEMFREE_STRUCT(tempBuff); 1862 } 1863 OMX_G729MEMFREE_STRUCT(pComponentPrivate->pOutputBufferList->pBufHdr[outputIndex]->pInputPortPrivate); 1864 } 1865 OMX_G729MEMFREE_STRUCT(pComponentPrivate->pOutputBufferList->pBufHdr[outputIndex]); 1866 1867 pComponentPrivate->pOutputBufferList->numBuffers--; 1868 if (pComponentPrivate->pOutputBufferList->numBuffers < 1869 pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->nBufferCountMin) 1870 { 1871 pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->bPopulated = OMX_FALSE; 1872 } 1873 if(pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->bEnabled && 1874 pComponentPrivate->bLoadedCommandPending == OMX_FALSE && 1875 (pComponentPrivate->curState == OMX_StateIdle || 1876 pComponentPrivate->curState == OMX_StateExecuting || 1877 pComponentPrivate->curState == OMX_StatePause)) 1878 { 1879 pComponentPrivate->cbInfo.EventHandler( pHandle, 1880 pHandle->pApplicationPrivate, 1881 OMX_EventError, 1882 OMX_ErrorPortUnpopulated, 1883 nPortIndex, 1884 NULL); 1885 } 1886 } 1887 else 1888 { 1889 eError = OMX_ErrorBadParameter; 1890 G729DEC_EPRINT("OMX_ErrorBadParameter.\n"); 1891 } 1892 if ((!pComponentPrivate->pInputBufferList->numBuffers && 1893 !pComponentPrivate->pOutputBufferList->numBuffers) && 1894 pComponentPrivate->InIdle_goingtoloaded) 1895 { 1896 pComponentPrivate->InIdle_goingtoloaded = 0; 1897#ifndef UNDER_CE 1898 pthread_mutex_lock(&pComponentPrivate->InIdle_mutex); 1899 pthread_cond_signal(&pComponentPrivate->InIdle_threshold); 1900 pthread_mutex_unlock(&pComponentPrivate->InIdle_mutex); 1901#else 1902 OMX_SignalEvent(&(pComponentPrivate->InIdle_event)); 1903#endif 1904 } 1905 if (pComponentPrivate->bDisableCommandPending &&(pComponentPrivate->pInputBufferList->numBuffers + pComponentPrivate->pOutputBufferList->numBuffers == 0)) 1906 { 1907 SendCommand (pComponentPrivate->pHandle, OMX_CommandPortDisable, 1908 pComponentPrivate->bDisableCommandParam,NULL); 1909 } 1910 G729DEC_DPRINT("Exiting. Returning = 0x%x\n", eError); 1911 return eError; 1912 1913} 1914 1915 1916static OMX_ERRORTYPE UseBuffer ( 1917 OMX_IN OMX_HANDLETYPE hComponent, 1918 OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr, 1919 OMX_IN OMX_U32 nPortIndex, 1920 OMX_IN OMX_PTR pAppPrivate, 1921 OMX_IN OMX_U32 nSizeBytes, 1922 OMX_IN OMX_U8* pBuffer) 1923{ 1924 OMX_PARAM_PORTDEFINITIONTYPE *pPortDef = NULL; 1925 G729DEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 1926 OMX_ERRORTYPE eError = OMX_ErrorNone; 1927 OMX_BUFFERHEADERTYPE *pBufferHeader = NULL; 1928 1929 pComponentPrivate = (G729DEC_COMPONENT_PRIVATE *) 1930 (((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate); 1931 1932 pPortDef = ((G729DEC_COMPONENT_PRIVATE*) 1933 pComponentPrivate)->pPortDef[nPortIndex]; 1934 G729DEC_DPRINT("pPortDef->bPopulated = %d\n",pPortDef->bPopulated); 1935 if(!pPortDef->bEnabled) 1936 { 1937 G729DEC_DPRINT ("%d :: In AllocateBuffer\n", __LINE__); 1938 eError = OMX_ErrorIncorrectStateOperation; 1939 goto EXIT; 1940 } 1941 if(nSizeBytes != pPortDef->nBufferSize || pPortDef->bPopulated) 1942 { 1943 G729DEC_DPRINT ("%d :: In AllocateBuffer\n", __LINE__); 1944 eError = OMX_ErrorBadParameter; 1945 goto EXIT; 1946 } 1947 OMX_G729MALLOC_STRUCT(pBufferHeader, OMX_BUFFERHEADERTYPE); 1948 if (nPortIndex == G729DEC_OUTPUT_PORT) { 1949 pBufferHeader->nInputPortIndex = -1; 1950 pBufferHeader->nOutputPortIndex = nPortIndex; 1951 pComponentPrivate->pOutputBufferList->pBufHdr[pComponentPrivate->pOutputBufferList->numBuffers] = pBufferHeader; 1952 pComponentPrivate->pOutputBufferList->bBufferPending[pComponentPrivate->pOutputBufferList->numBuffers] = 0; 1953 pComponentPrivate->pOutputBufferList->bufferOwner[pComponentPrivate->pOutputBufferList->numBuffers++] = 0; 1954 if (pComponentPrivate->pOutputBufferList->numBuffers == pPortDef->nBufferCountActual) { 1955 pPortDef->bPopulated = OMX_TRUE; 1956 } 1957 } 1958 else { 1959 pBufferHeader->nInputPortIndex = nPortIndex; 1960 pBufferHeader->nOutputPortIndex = -1; 1961 pComponentPrivate->pInputBufferList->pBufHdr[pComponentPrivate->pInputBufferList->numBuffers] = pBufferHeader; 1962 pComponentPrivate->pInputBufferList->bBufferPending[pComponentPrivate->pInputBufferList->numBuffers] = 0; 1963 pComponentPrivate->pInputBufferList->bufferOwner[pComponentPrivate->pInputBufferList->numBuffers++] = 0; 1964 if (pComponentPrivate->pInputBufferList->numBuffers == pPortDef->nBufferCountActual) { 1965 pPortDef->bPopulated = OMX_TRUE; 1966 } 1967 } 1968 1969 if((pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->bPopulated == pComponentPrivate->pPortDef[G729DEC_OUTPUT_PORT]->bEnabled)&& 1970 (pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->bPopulated == pComponentPrivate->pPortDef[G729DEC_INPUT_PORT]->bEnabled) && 1971 (pComponentPrivate->InLoaded_readytoidle)) 1972 { 1973 pComponentPrivate->InLoaded_readytoidle = 0; 1974 1975#ifndef UNDER_CE 1976 pthread_mutex_lock(&pComponentPrivate->InLoaded_mutex); 1977 pthread_cond_signal(&pComponentPrivate->InLoaded_threshold); 1978 pthread_mutex_unlock(&pComponentPrivate->InLoaded_mutex); 1979#else 1980 OMX_SignalEvent(&(pComponentPrivate->InLoaded_event)); 1981#endif 1982 1983 } 1984 1985 pBufferHeader->pAppPrivate = pAppPrivate; 1986 OMX_G729MALLOC_STRUCT(pBufferHeader->pInputPortPrivate, G729DEC_BufParamStruct); 1987 ((G729DEC_BufParamStruct*)pBufferHeader->pInputPortPrivate)->bNoUseDefaults = OMX_FALSE; /* setting a flag to use defaults until client says otherwise */ 1988 pBufferHeader->pPlatformPrivate = pComponentPrivate; 1989 pBufferHeader->nAllocLen = nSizeBytes; 1990 pBufferHeader->nVersion.s.nVersionMajor = G729DEC_MAJOR_VER; 1991 pBufferHeader->nVersion.s.nVersionMinor = G729DEC_MINOR_VER; 1992 pComponentPrivate->nVersion = pBufferHeader->nVersion.nVersion; 1993 pBufferHeader->pBuffer = pBuffer; 1994 pBufferHeader->nSize = sizeof(OMX_BUFFERHEADERTYPE); 1995 *ppBufferHdr = pBufferHeader; 1996 G729DEC_DPRINT("pBufferHeader = %p\n",pBufferHeader); 1997 if (pComponentPrivate->bEnableCommandPending && pPortDef->bPopulated) { 1998 SendCommand (pComponentPrivate->pHandle, 1999 OMX_CommandPortEnable, 2000 pComponentPrivate->bEnableCommandParam,NULL); 2001 } 2002 EXIT: 2003 return eError; 2004} 2005 2006/* ================================================================================= */ 2007/** 2008 * @fn GetExtensionIndex() description for GetExtensionIndex 2009 GetExtensionIndex(). 2010 Returns index for vendor specific settings. 2011 * 2012 * @see OMX_Core.h 2013 */ 2014/* ================================================================================ */ 2015static OMX_ERRORTYPE GetExtensionIndex( 2016 OMX_IN OMX_HANDLETYPE hComponent, 2017 OMX_IN OMX_STRING cParameterName, 2018 OMX_OUT OMX_INDEXTYPE *pIndexType) 2019{ 2020 OMX_ERRORTYPE eError = OMX_ErrorNone; 2021 2022 if(!(strcmp(cParameterName,"OMX.TI.index.config.g729headerinfo"))) 2023 { 2024 *pIndexType = OMX_IndexCustomG729DecHeaderInfoConfig; 2025 } 2026 else if(!(strcmp(cParameterName,"OMX.TI.index.config.g729.datapath"))) 2027 { 2028 *pIndexType = OMX_IndexCustomG729DecDataPath; 2029 } 2030 2031 else { 2032 eError = OMX_ErrorBadParameter; 2033 } 2034 return eError; 2035} 2036 2037 2038/* ================================================================================= */ 2039/** 2040 * @fn ComponentRoleEnum() description for ComponentRoleEnum() 2041 2042 Returns the role at the given index 2043 * 2044 * @see OMX_Core.h 2045 */ 2046/* ================================================================================ */ 2047static OMX_ERRORTYPE ComponentRoleEnum( 2048 OMX_IN OMX_HANDLETYPE hComponent, 2049 OMX_OUT OMX_U8 *cRole, 2050 OMX_IN OMX_U32 nIndex) 2051{ 2052 OMX_ERRORTYPE eError = OMX_ErrorNone; 2053 2054 eError = OMX_ErrorNotImplemented; 2055 return eError; 2056} 2057 2058#ifdef UNDER_CE 2059/* ================================================================================= */ 2060/** 2061 * @fns Sleep replace for WIN CE 2062 */ 2063/* ================================================================================ */ 2064int OMX_CreateEvent(OMX_Event *event){ 2065 int ret = OMX_ErrorNone; 2066 HANDLE createdEvent = NULL; 2067 if(event == NULL){ 2068 ret = OMX_ErrorBadParameter; 2069 goto EXIT; 2070 } 2071 event->event = CreateEvent(NULL, TRUE, FALSE, NULL); 2072 if(event->event == NULL) 2073 ret = (int)GetLastError(); 2074 EXIT: 2075 return ret; 2076} 2077 2078int OMX_SignalEvent(OMX_Event *event){ 2079 int ret = OMX_ErrorNone; 2080 if(event == NULL){ 2081 ret = OMX_ErrorBadParameter; 2082 goto EXIT; 2083 } 2084 SetEvent(event->event); 2085 ret = (int)GetLastError(); 2086 EXIT: 2087 return ret; 2088} 2089 2090int OMX_WaitForEvent(OMX_Event *event) { 2091 int ret = OMX_ErrorNone; 2092 if(event == NULL){ 2093 ret = OMX_ErrorBadParameter; 2094 goto EXIT; 2095 } 2096 WaitForSingleObject(event->event, INFINITE); 2097 ret = (int)GetLastError(); 2098 EXIT: 2099 return ret; 2100} 2101 2102int OMX_DestroyEvent(OMX_Event *event) { 2103 int ret = OMX_ErrorNone; 2104 if(event == NULL){ 2105 ret = OMX_ErrorBadParameter; 2106 goto EXIT; 2107 } 2108 CloseHandle(event->event); 2109 EXIT: 2110 return ret; 2111} 2112#endif 2113