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_AacDecoder.c 30 * 31 * This file implements OMX Component for AAC decoder that 32 * is fully compliant with the OMX Audio specification 1.5. 33 * 34 * @path $(CSLPATH)\ 35 * 36 * @rev 1.0 37 */ 38 /* ---------------------------------------------------------------------------- 39 *! 40 *! Revision History 41 *! =================================== 42 *! 13-Dec-2005 mf: Initial Version. Change required per OMAPSWxxxxxxxxx 43 *! to provide _________________. 44 *! 45 * ============================================================================= */ 46 47 /* ------compilation control switches -------------------------*/ 48 /**************************************************************** 49 * INCLUDE FILES 50 ****************************************************************/ 51 /* ----- system and platform files ----------------------------*/ 52 53 54 #ifdef UNDER_CE 55 #include <windows.h> 56 #include <oaf_osal.h> 57 #include <omx_core.h> 58 59 #else 60 #include <wchar.h> 61 #include <unistd.h> 62 #include <sys/time.h> 63 #include <sys/types.h> 64 #include <sys/ioctl.h> 65 #include <sys/select.h> 66 #include <errno.h> 67 #include <pthread.h> 68 #endif 69 70 #include <string.h> 71 #include <fcntl.h> 72 #include <stdlib.h> 73 #include <stdio.h> 74 #include <dbapi.h> 75 76 /*------- Program Header Files -----------------------------------------------*/ 77 #ifdef RESOURCE_MANAGER_ENABLED 78 #include <ResourceManagerProxyAPI.h> 79 #endif 80 81 #include "LCML_DspCodec.h" 82 #include "OMX_AacDec_Utils.h" 83 #include <TIDspOmx.h> 84 85 #ifdef RESOURCE_MANAGER_ENABLED 86 #include <ResourceManagerProxyAPI.h> 87 #endif 88 89 #ifdef DSP_RENDERING_ON 90 #include <AudioManagerAPI.h> 91 #define FIFO1 "/dev/fifo.1" 92 #define FIFO2 "/dev/fifo.2" 93 #define PERMS 0666 94 95 AM_COMMANDDATATYPE cmd_data; 96 int aacdec_fdwrite, aacdec_fdread; 97 int errno; 98 #endif 99 100 /* define component role */ 101 #define AAC_DEC_ROLE "audio_decoder.aac" 102 103 /**************************************************************** 104 * EXTERNAL REFERENCES NOTE : only use if not found in header file 105 ****************************************************************/ 106 /*--------data declarations -----------------------------------*/ 107 108 /*--------function prototypes ---------------------------------*/ 109 110 /**************************************************************** 111 * PUBLIC DECLARATIONS Defined here, used elsewhere 112 ****************************************************************/ 113 /*--------data declarations -----------------------------------*/ 114 115 /*--------function prototypes ---------------------------------*/ 116 117 /**************************************************************** 118 * PRIVATE DECLARATIONS Defined here, used only here 119 ****************************************************************/ 120 /*--------data declarations -----------------------------------*/ 121 122 /*--------function prototypes ---------------------------------*/ 123 124 static OMX_ERRORTYPE SetCallbacks (OMX_HANDLETYPE hComp, 125 OMX_CALLBACKTYPE* pCallBacks, OMX_PTR pAppData); 126 static OMX_ERRORTYPE GetComponentVersion (OMX_HANDLETYPE hComp, 127 OMX_STRING pComponentName, 128 OMX_VERSIONTYPE* pComponentVersion, 129 OMX_VERSIONTYPE* pSpecVersion, 130 OMX_UUIDTYPE* pComponentUUID); 131 132 static OMX_ERRORTYPE SendCommand (OMX_HANDLETYPE hComp, OMX_COMMANDTYPE nCommand, 133 OMX_U32 nParam, OMX_PTR pCmdData); 134 135 static OMX_ERRORTYPE GetParameter(OMX_HANDLETYPE hComp, OMX_INDEXTYPE nParamIndex, 136 OMX_PTR ComponentParamStruct); 137 static OMX_ERRORTYPE SetParameter (OMX_HANDLETYPE hComp, 138 OMX_INDEXTYPE nParamIndex, 139 OMX_PTR ComponentParamStruct); 140 static OMX_ERRORTYPE GetConfig (OMX_HANDLETYPE hComp, 141 OMX_INDEXTYPE nConfigIndex, 142 OMX_PTR pComponentConfigStructure); 143 static OMX_ERRORTYPE SetConfig (OMX_HANDLETYPE hComp, 144 OMX_INDEXTYPE nConfigIndex, 145 OMX_PTR pComponentConfigStructure); 146 147 static OMX_ERRORTYPE EmptyThisBuffer (OMX_HANDLETYPE hComp, OMX_BUFFERHEADERTYPE* pBuffer); 148 149 static OMX_ERRORTYPE FillThisBuffer (OMX_HANDLETYPE hComp, OMX_BUFFERHEADERTYPE* pBuffer); 150 static OMX_ERRORTYPE GetState (OMX_HANDLETYPE hComp, OMX_STATETYPE* pState); 151 static OMX_ERRORTYPE ComponentTunnelRequest (OMX_HANDLETYPE hComp, 152 OMX_U32 nPort, OMX_HANDLETYPE hTunneledComp, 153 OMX_U32 nTunneledPort, 154 OMX_TUNNELSETUPTYPE* pTunnelSetup); 155 156 static OMX_ERRORTYPE ComponentDeInit(OMX_HANDLETYPE pHandle); 157 158 static OMX_ERRORTYPE AllocateBuffer (OMX_IN OMX_HANDLETYPE hComponent, 159 OMX_INOUT OMX_BUFFERHEADERTYPE** pBuffer, 160 OMX_IN OMX_U32 nPortIndex, 161 OMX_IN OMX_PTR pAppPrivate, 162 OMX_IN OMX_U32 nSizeBytes); 163 164 static OMX_ERRORTYPE FreeBuffer(OMX_IN OMX_HANDLETYPE hComponent, 165 OMX_IN OMX_U32 nPortIndex, 166 OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); 167 168 static OMX_ERRORTYPE UseBuffer (OMX_IN OMX_HANDLETYPE hComponent, 169 OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr, 170 OMX_IN OMX_U32 nPortIndex, 171 OMX_IN OMX_PTR pAppPrivate, 172 OMX_IN OMX_U32 nSizeBytes, 173 OMX_IN OMX_U8* pBuffer); 174 175 176 static OMX_ERRORTYPE GetExtensionIndex(OMX_IN OMX_HANDLETYPE hComponent, 177 OMX_IN OMX_STRING cParameterName, 178 OMX_OUT OMX_INDEXTYPE* pIndexType); 179 180 static OMX_ERRORTYPE ComponentRoleEnum(OMX_IN OMX_HANDLETYPE hComponent, 181 OMX_OUT OMX_U8 *cRole, 182 OMX_IN OMX_U32 nIndex); 183 184 185 /*-------------------------------------------------------------------*/ 186 /** 187 * OMX_ComponentInit() Set the all the function pointers of component 188 * 189 * This method will update the component function pointer to the handle 190 * 191 * @param hComp handle for this instance of the component 192 * 193 * @retval OMX_NoError Success, ready to roll 194 * OMX_ErrorInsufficientResources If the malloc fails 195 **/ 196 /*-------------------------------------------------------------------*/ 197 OMX_ERRORTYPE OMX_ComponentInit (OMX_HANDLETYPE hComp) 198 { 199 OMX_ERRORTYPE eError = OMX_ErrorNone; 200 OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE*) hComp; 201 OMX_PARAM_PORTDEFINITIONTYPE *pPortDef_ip = NULL, *pPortDef_op = NULL; 202 OMX_AUDIO_PARAM_PORTFORMATTYPE *pPortFormat = NULL; 203 OMX_AUDIO_PARAM_AACPROFILETYPE *aac_ip = NULL; 204 OMX_AUDIO_PARAM_PCMMODETYPE *aac_op = NULL; 205 AACDEC_COMPONENT_PRIVATE *pComponentPrivate; 206 AUDIODEC_PORT_TYPE *pCompPort = NULL; 207 AACDEC_BUFFERLIST *pTemp = NULL; 208 int i=0; 209 210 OMXDBG_PRINT(stderr, PRINT, 1, 0, "%d :: Entering OMX_ComponentInit\n", __LINE__); 211 212 AACDEC_OMX_CONF_CHECK_CMD(pHandle,1,1); 213 214 pHandle->SetCallbacks = SetCallbacks; 215 pHandle->GetComponentVersion = GetComponentVersion; 216 pHandle->SendCommand = SendCommand; 217 pHandle->GetParameter = GetParameter; 218 pHandle->SetParameter = SetParameter; 219 pHandle->GetExtensionIndex = GetExtensionIndex; 220 pHandle->GetConfig = GetConfig; 221 pHandle->SetConfig = SetConfig; 222 pHandle->GetState = GetState; 223 pHandle->EmptyThisBuffer = EmptyThisBuffer; 224 pHandle->FillThisBuffer = FillThisBuffer; 225 pHandle->ComponentTunnelRequest = ComponentTunnelRequest; 226 pHandle->ComponentDeInit = ComponentDeInit; 227 pHandle->AllocateBuffer = AllocateBuffer; 228 pHandle->FreeBuffer = FreeBuffer; 229 pHandle->UseBuffer = UseBuffer; 230 pHandle->ComponentRoleEnum = ComponentRoleEnum; 231 232 OMX_MALLOC_GENERIC(pHandle->pComponentPrivate,AACDEC_COMPONENT_PRIVATE); 233 234 pComponentPrivate = pHandle->pComponentPrivate; 235 pComponentPrivate->pHandle = pHandle; 236 OMX_DBG_INIT(pComponentPrivate->dbg, "OMX_DBG_AACDEC"); 237 238 #ifdef __PERF_INSTRUMENTATION__ 239 pComponentPrivate->pPERF = PERF_Create(PERF_FOURCC('A','A','C','D'), 240 PERF_ModuleLLMM | 241 PERF_ModuleAudioDecode); 242 #endif 243 244 245 #ifdef ANDROID /* leave this now, we may need them later. */ 246 pComponentPrivate->iPVCapabilityFlags.iIsOMXComponentMultiThreaded = OMX_TRUE; 247 pComponentPrivate->iPVCapabilityFlags.iOMXComponentNeedsNALStartCode = OMX_FALSE; 248 pComponentPrivate->iPVCapabilityFlags.iOMXComponentSupportsExternalOutputBufferAlloc = OMX_FALSE; 249 pComponentPrivate->iPVCapabilityFlags.iOMXComponentSupportsExternalInputBufferAlloc = OMX_FALSE; 250 pComponentPrivate->iPVCapabilityFlags.iOMXComponentSupportsMovableInputBuffers = OMX_FALSE; 251 pComponentPrivate->iPVCapabilityFlags.iOMXComponentSupportsPartialFrames = OMX_FALSE; 252 pComponentPrivate->iPVCapabilityFlags.iOMXComponentCanHandleIncompleteFrames = OMX_FALSE; 253 #endif 254 255 256 OMX_MALLOC_GENERIC(pCompPort, AUDIODEC_PORT_TYPE); 257 pComponentPrivate->pCompPort[INPUT_PORT_AACDEC] = pCompPort; 258 259 OMX_MALLOC_GENERIC(pCompPort, AUDIODEC_PORT_TYPE); 260 pComponentPrivate->pCompPort[OUTPUT_PORT_AACDEC] = pCompPort; 261 OMX_MALLOC_GENERIC(pTemp, AACDEC_BUFFERLIST); 262 pComponentPrivate->pInputBufferList = pTemp; 263 264 OMX_MALLOC_GENERIC(pTemp, AACDEC_BUFFERLIST); 265 pComponentPrivate->pOutputBufferList = pTemp; 266 267 pComponentPrivate->pInputBufferList->numBuffers = 0; 268 pComponentPrivate->pOutputBufferList->numBuffers = 0; 269 270 for (i=0; i < MAX_NUM_OF_BUFS_AACDEC; i++) { 271 pComponentPrivate->pInputBufferList->pBufHdr[i] = NULL; 272 pComponentPrivate->pOutputBufferList->pBufHdr[i] = NULL; 273 } 274 275 pComponentPrivate->bufAlloced = 0; 276 277 OMX_MALLOC_GENERIC(pComponentPrivate->sPortParam, OMX_PORT_PARAM_TYPE); 278 OMX_CONF_INIT_STRUCT(pComponentPrivate->sPortParam, OMX_PORT_PARAM_TYPE); 279 OMX_MALLOC_GENERIC(pComponentPrivate->pPriorityMgmt, OMX_PRIORITYMGMTTYPE); 280 OMX_CONF_INIT_STRUCT(pComponentPrivate->pPriorityMgmt, OMX_PRIORITYMGMTTYPE); 281 pComponentPrivate->sPortParam->nPorts = NUM_OF_PORTS_AACDEC; 282 pComponentPrivate->sPortParam->nStartPortNumber = 0x0; 283 284 pComponentPrivate->aacParams = NULL; 285 pComponentPrivate->pcmParams = NULL; 286 OMX_MALLOC_GENERIC(aac_ip,OMX_AUDIO_PARAM_AACPROFILETYPE); 287 OMX_MALLOC_GENERIC(aac_op,OMX_AUDIO_PARAM_PCMMODETYPE); 288 pComponentPrivate->aacParams = aac_ip; 289 pComponentPrivate->pcmParams = aac_op; 290 291 pComponentPrivate->dasfmode = 0; 292 pComponentPrivate->bCompThreadStarted = 0; 293 pComponentPrivate->bExitCompThrd = 0; 294 295 pComponentPrivate->parameteric_stereo = 0; 296 pComponentPrivate->bInitParamsInitialized = 0; 297 pComponentPrivate->pMarkBuf = NULL; 298 pComponentPrivate->pMarkData = NULL; 299 pComponentPrivate->nEmptyBufferDoneCount = 0; 300 pComponentPrivate->nEmptyThisBufferCount = 0; 301 pComponentPrivate->nFillBufferDoneCount = 0; 302 pComponentPrivate->nFillThisBufferCount = 0; 303 pComponentPrivate->strmAttr = NULL; 304 pComponentPrivate->bDisableCommandParam = 0; 305 pComponentPrivate->bEnableCommandParam = 0; 306 pComponentPrivate->nUnhandledFillThisBuffers = 0; 307 pComponentPrivate->nHandledFillThisBuffers = 0; 308 pComponentPrivate->nUnhandledEmptyThisBuffers = 0; 309 pComponentPrivate->nHandledEmptyThisBuffers = 0; 310 pComponentPrivate->SendAfterEOS = 1; 311 pComponentPrivate->bFlushOutputPortCommandPending = OMX_FALSE; 312 pComponentPrivate->bFlushInputPortCommandPending = OMX_FALSE; 313 pComponentPrivate->first_buff = 0; 314 pComponentPrivate->first_TS = 0; 315 pComponentPrivate->bConfigData = 1; /* assume the first buffer received will contain only config data */ 316 pComponentPrivate->reconfigInputPort = 0; 317 pComponentPrivate->reconfigOutputPort = 0; 318 pComponentPrivate->framemode = 0; 319 320 321 for (i=0; i < MAX_NUM_OF_BUFS_AACDEC; i++) { 322 pComponentPrivate->pInputBufHdrPending[i] = NULL; 323 pComponentPrivate->pOutputBufHdrPending[i] = NULL; 324 } 325 pComponentPrivate->nNumInputBufPending = 0; 326 pComponentPrivate->nNumOutputBufPending = 0; 327 328 for (i=0; i < MAX_NUM_OF_BUFS_AACDEC; i++) { 329 pComponentPrivate->pInBufHdrPausedPending[i] = NULL; 330 pComponentPrivate->pOutBufHdrPausedPending[i] = NULL; 331 } 332 pComponentPrivate->PendingInPausedBufs = 0; 333 pComponentPrivate->PendingOutPausedBufs = 0; 334 335 pComponentPrivate->nInvalidFrameCount = 0; 336 pComponentPrivate->bDisableCommandPending = 0; 337 pComponentPrivate->bEnableCommandPending = 0; 338 339 pComponentPrivate->SBR = 0; 340 pComponentPrivate->RAW = 0; /* doesn't do anything, consider deleting */ 341 pComponentPrivate->numPendingBuffers = 0; 342 pComponentPrivate->bNoIdleOnStop= OMX_FALSE; 343 pComponentPrivate->bDspStoppedWhileExecuting = OMX_FALSE; 344 pComponentPrivate->nOutStandingFillDones = 0; 345 pComponentPrivate->nOpBit = 0; 346 pComponentPrivate->dualMonoMode = 0; 347 pComponentPrivate->bIsInvalidState = OMX_FALSE; 348 pComponentPrivate->sOutPortFormat.eEncoding = OMX_AUDIO_CodingPCM; 349 350 /* Initialize device string to the default value */ 351 OMX_MALLOC_SIZE(pComponentPrivate->sDeviceString,(100*sizeof(OMX_STRING)),OMX_STRING); 352 strcpy((char*)pComponentPrivate->sDeviceString,"/eteedn:i0:o0/codec\0"); 353 354 /* initialize role name */ 355 OMX_MALLOC_GENERIC(pComponentPrivate->componentRole,OMX_PARAM_COMPONENTROLETYPE); 356 strcpy((char*)pComponentPrivate->componentRole->cRole, AAC_DEC_ROLE); 357 358 OMX_MALLOC_GENERIC(pPortDef_ip, OMX_PARAM_PORTDEFINITIONTYPE); 359 OMX_MALLOC_GENERIC(pPortDef_op, OMX_PARAM_PORTDEFINITIONTYPE); 360 361 pComponentPrivate->pPortDef[INPUT_PORT_AACDEC] = pPortDef_ip; 362 pComponentPrivate->pPortDef[OUTPUT_PORT_AACDEC] = pPortDef_op; 363 364 #ifndef UNDER_CE 365 pthread_mutex_init(&pComponentPrivate->AlloBuf_mutex, NULL); 366 pthread_cond_init (&pComponentPrivate->AlloBuf_threshold, NULL); 367 pComponentPrivate->AlloBuf_waitingsignal = 0; 368 369 pthread_mutex_init(&pComponentPrivate->InLoaded_mutex, NULL); 370 pthread_cond_init (&pComponentPrivate->InLoaded_threshold, NULL); 371 pComponentPrivate->InLoaded_readytoidle = 0; 372 373 pthread_mutex_init(&pComponentPrivate->InIdle_mutex, NULL); 374 pthread_cond_init (&pComponentPrivate->InIdle_threshold, NULL); 375 pComponentPrivate->InIdle_goingtoloaded = 0; 376 377 pthread_mutex_init(&pComponentPrivate->codecStop_mutex, NULL); 378 pthread_cond_init (&pComponentPrivate->codecStop_threshold, NULL); 379 pComponentPrivate->codecStop_waitingsignal = 0; 380 381 pthread_mutex_init(&pComponentPrivate->codecFlush_mutex, NULL); 382 pthread_cond_init (&pComponentPrivate->codecFlush_threshold, NULL); 383 pComponentPrivate->codecFlush_waitingsignal = 0; 384 385 #else 386 OMX_CreateEvent(&(pComponentPrivate->AlloBuf_event)); 387 pComponentPrivate->AlloBuf_waitingsignal = 0; 388 389 OMX_CreateEvent(&(pComponentPrivate->InLoaded_event)); 390 pComponentPrivate->InLoaded_readytoidle = 0; 391 392 OMX_CreateEvent(&(pComponentPrivate->InIdle_event)); 393 pComponentPrivate->InIdle_goingtoloaded = 0; 394 #endif 395 396 /* Set input port defaults */ 397 pPortDef_ip->nSize = sizeof (OMX_PARAM_PORTDEFINITIONTYPE); 398 pPortDef_ip->nPortIndex = INPUT_PORT_AACDEC; 399 pPortDef_ip->eDir = OMX_DirInput; 400 pPortDef_ip->nBufferCountActual = AACD_NUM_INPUT_BUFFERS; 401 pPortDef_ip->nBufferCountMin = AACD_NUM_INPUT_BUFFERS; 402 pPortDef_ip->nBufferSize = AACD_INPUT_BUFFER_SIZE; 403 pPortDef_ip->nBufferAlignment = DSP_CACHE_ALIGNMENT; 404 pPortDef_ip->bEnabled = OMX_TRUE; 405 pPortDef_ip->bPopulated = OMX_FALSE; 406 pPortDef_ip->eDomain = OMX_PortDomainAudio; 407 pPortDef_ip->format.audio.eEncoding = OMX_AUDIO_CodingAAC; 408 pPortDef_ip->format.audio.cMIMEType = NULL; 409 pPortDef_ip->format.audio.pNativeRender = NULL; 410 pPortDef_ip->format.audio.bFlagErrorConcealment = OMX_FALSE; 411 412 /* Set input port defaults */ 413 pPortDef_op->nSize = sizeof (OMX_PARAM_PORTDEFINITIONTYPE); 414 pPortDef_op->nPortIndex = OUTPUT_PORT_AACDEC; 415 pPortDef_op->eDir = OMX_DirOutput; 416 pPortDef_op->nBufferCountMin = AACD_NUM_OUTPUT_BUFFERS; 417 pPortDef_op->nBufferCountActual = AACD_NUM_OUTPUT_BUFFERS; 418 pPortDef_op->nBufferSize = AACD_OUTPUT_BUFFER_SIZE; 419 pPortDef_op->nBufferAlignment = DSP_CACHE_ALIGNMENT; 420 pPortDef_op->bEnabled = OMX_TRUE; 421 pPortDef_op->bPopulated = OMX_FALSE; 422 pPortDef_op->eDomain = OMX_PortDomainAudio; 423 pPortDef_op->format.audio.eEncoding = OMX_AUDIO_CodingPCM; 424 pPortDef_op->format.audio.cMIMEType = NULL; 425 pPortDef_op->format.audio.pNativeRender = NULL; 426 pPortDef_op->format.audio.bFlagErrorConcealment = OMX_FALSE; 427 428 OMX_MALLOC_GENERIC(pComponentPrivate->pCompPort[INPUT_PORT_AACDEC]->pPortFormat, OMX_AUDIO_PARAM_PORTFORMATTYPE); 429 OMX_MALLOC_GENERIC(pComponentPrivate->pCompPort[OUTPUT_PORT_AACDEC]->pPortFormat, OMX_AUDIO_PARAM_PORTFORMATTYPE); 430 OMX_CONF_INIT_STRUCT(pComponentPrivate->pCompPort[INPUT_PORT_AACDEC]->pPortFormat, OMX_AUDIO_PARAM_PORTFORMATTYPE); 431 OMX_CONF_INIT_STRUCT(pComponentPrivate->pCompPort[OUTPUT_PORT_AACDEC]->pPortFormat, OMX_AUDIO_PARAM_PORTFORMATTYPE); 432 433 pComponentPrivate->bPreempted = OMX_FALSE; 434 435 /* Set input port format defaults */ 436 pPortFormat = pComponentPrivate->pCompPort[INPUT_PORT_AACDEC]->pPortFormat; 437 OMX_CONF_INIT_STRUCT(pPortFormat, OMX_AUDIO_PARAM_PORTFORMATTYPE); 438 pPortFormat->nPortIndex = INPUT_PORT_AACDEC; 439 pPortFormat->nIndex = OMX_IndexParamAudioAac; 440 pPortFormat->eEncoding = OMX_AUDIO_CodingAAC; 441 442 /* Set output port format defaults */ 443 pPortFormat = pComponentPrivate->pCompPort[OUTPUT_PORT_AACDEC]->pPortFormat; 444 OMX_CONF_INIT_STRUCT(pPortFormat, OMX_AUDIO_PARAM_PORTFORMATTYPE); 445 pPortFormat->nPortIndex = OUTPUT_PORT_AACDEC; 446 pPortFormat->nIndex = OMX_IndexParamAudioPcm; 447 pPortFormat->eEncoding = OMX_AUDIO_CodingPCM; 448 449 /* AAC format defaults */ 450 OMX_CONF_INIT_STRUCT(aac_ip, OMX_AUDIO_PARAM_AACPROFILETYPE); 451 aac_ip->nPortIndex = INPUT_PORT_AACDEC; 452 aac_ip->nSampleRate = AACD_SAMPLING_FREQUENCY; 453 aac_ip->nChannels = STEREO_INTERLEAVED_STREAM_AACDEC; 454 aac_ip->eChannelMode = OMX_AUDIO_ChannelModeStereo; 455 aac_ip->eAACProfile = OMX_AUDIO_AACObjectLC; 456 aac_ip->eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP2ADTS; 457 458 #ifdef ANDROID 459 /* the default mode of operation for android */ 460 aac_ip->eAACStreamFormat = OMX_AUDIO_AACStreamFormatRAW; 461 #endif 462 463 /* PCM format defaults */ 464 OMX_CONF_INIT_STRUCT(aac_op, OMX_AUDIO_PARAM_PCMMODETYPE); 465 aac_op->eNumData= OMX_NumericalDataSigned; 466 aac_op->ePCMMode = OMX_AUDIO_PCMModeLinear; 467 aac_op->nPortIndex = OUTPUT_PORT_AACDEC; 468 aac_op->nBitPerSample = 16; 469 aac_op->nChannels = STEREO_INTERLEAVED_STREAM_AACDEC; 470 aac_op->nSamplingRate = AACD_SAMPLING_FREQUENCY; 471 aac_op->bInterleaved = OMX_TRUE; 472 473 pComponentPrivate->bPortDefsAllocated = 1; 474 475 #ifdef DSP_RENDERING_ON 476 if((aacdec_fdwrite=open(FIFO1,O_WRONLY))<0) { 477 OMX_ERROR4(pComponentPrivate->dbg, "[AAC Component] - failure to open WRITE pipe\n"); 478 eError = OMX_ErrorHardware; 479 } 480 481 if((aacdec_fdread=open(FIFO2,O_RDONLY))<0) { 482 OMX_ERROR4(pComponentPrivate->dbg, "[AAC Component] - failure to open READ pipe\n"); 483 eError = OMX_ErrorHardware; 484 } 485 #endif 486 487 #ifdef RESOURCE_MANAGER_ENABLED 488 eError = RMProxy_NewInitalize(); 489 if (eError != OMX_ErrorNone) { 490 OMX_ERROR4(pComponentPrivate->dbg, "%d ::Error returned from loading ResourceManagerProxy\thread\n", __LINE__); 491 goto EXIT; 492 } 493 #endif 494 eError = AacDec_StartCompThread(pHandle); 495 if (eError != OMX_ErrorNone) { 496 OMX_ERROR4(pComponentPrivate->dbg, "%d ::Error returned from the Component\n", 497 __LINE__); 498 goto EXIT; 499 } 500 501 #ifdef __PERF_INSTRUMENTATION__ 502 PERF_ThreadCreated(pComponentPrivate->pPERF, pComponentPrivate->ComponentThread,PERF_FOURCC('A','A','C','T')); 503 #endif 504 505 EXIT: 506 if(OMX_ErrorNone != eError) { 507 OMX_ERROR4(pComponentPrivate->dbg, "%d :: ************* ERROR: Freeing Other Malloced Resources\n",__LINE__); 508 OMX_MEMFREE_STRUCT(pPortDef_ip); 509 OMX_MEMFREE_STRUCT(pPortDef_op); 510 OMX_MEMFREE_STRUCT(aac_ip); 511 OMX_MEMFREE_STRUCT(aac_op); 512 OMX_MEMFREE_STRUCT(pTemp); 513 } 514 OMX_PRINT1(pComponentPrivate->dbg, "%d :: Exiting OMX_ComponentInit\n", __LINE__); 515 return eError; 516 } 517 518 /*-------------------------------------------------------------------*/ 519 /** 520 * SendCommand() used to send the commands to the component 521 * 522 * This method will be used by the application. 523 * 524 * @param phandle handle for this instance of the component 525 * @param Cmd Command to be sent to the component 526 * @param nParam indicates commmad is sent using this method 527 * 528 * @retval OMX_NoError Success, ready to roll 529 * OMX_Error_BadParameter The input parameter pointer is null 530 **/ 531 /*-------------------------------------------------------------------*/ 532 533 static OMX_ERRORTYPE SendCommand (OMX_HANDLETYPE phandle, 534 OMX_COMMANDTYPE Cmd, 535 OMX_U32 nParam,OMX_PTR pCmdData) 536 { 537 OMX_ERRORTYPE eError = OMX_ErrorNone; 538 int nRet; 539 OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)phandle; 540 AACDEC_COMPONENT_PRIVATE *pCompPrivate = NULL; 541 542 AACDEC_OMX_CONF_CHECK_CMD(pHandle,1,1) 543 pCompPrivate = (AACDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 544 545 #ifdef _ERROR_PROPAGATION__ 546 if (pCompPrivate->curState == OMX_StateInvalid){ 547 eError = OMX_ErrorInvalidState; 548 OMX_ERROR4(pCompPrivate->dbg, "%d ::Error returned from the Component\n", 549 __LINE__); 550 goto EXIT; 551 } 552 #else 553 if(pCompPrivate->curState == OMX_StateInvalid){ 554 OMX_ERROR4(pCompPrivate->dbg, "%d ::Error returned from the Component\n", 555 __LINE__); 556 AACDEC_OMX_ERROR_EXIT(eError, OMX_ErrorInvalidState,"OMX_ErrorInvalidState"); 557 } 558 #endif 559 #ifdef __PERF_INSTRUMENTATION__ 560 PERF_SendingCommand(pCompPrivate->pPERF, 561 Cmd, 562 (Cmd == OMX_CommandMarkBuffer) ? ((OMX_U32) pCmdData) : nParam, 563 PERF_ModuleComponent); 564 #endif 565 switch(Cmd) { 566 case OMX_CommandStateSet: 567 if (nParam == OMX_StateLoaded) { 568 pCompPrivate->bLoadedCommandPending = OMX_TRUE; 569 } 570 if(pCompPrivate->curState == OMX_StateLoaded) { 571 if((nParam == OMX_StateExecuting) || (nParam == OMX_StatePause)) { 572 pCompPrivate->cbInfo.EventHandler (pHandle, 573 pHandle->pApplicationPrivate, 574 OMX_EventError, 575 OMX_ErrorIncorrectStateTransition, 576 OMX_TI_ErrorMinor, 577 NULL); 578 OMX_ERROR4(pCompPrivate->dbg, "%d :: Incorrect St Tr fm Loaded to Executing By App\n",__LINE__); 579 goto EXIT; 580 } 581 582 if(nParam == OMX_StateInvalid) { 583 pCompPrivate->curState = OMX_StateInvalid; 584 pCompPrivate->cbInfo.EventHandler (pHandle, 585 pHandle->pApplicationPrivate, 586 OMX_EventError, 587 OMX_ErrorInvalidState, 588 OMX_TI_ErrorMinor, 589 NULL); 590 OMX_ERROR4(pCompPrivate->dbg, "%d :: Incorrect State Tr from Loaded to Invalid by Application\n",__LINE__); 591 goto EXIT; 592 } 593 } 594 break; 595 case OMX_CommandFlush: 596 if(nParam > 1 && nParam != -1) { 597 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorBadPortIndex,"OMX_ErrorBadPortIndex"); 598 } 599 break; 600 case OMX_CommandPortDisable: 601 OMX_PRDSP2(pCompPrivate->dbg, "%d :: AACDEC: Entered switch - Command Port Disable \n",__LINE__); 602 break; 603 case OMX_CommandPortEnable: 604 OMX_PRDSP2(pCompPrivate->dbg, "%d :: AACDEC: Entered switch - Command Port Enable \n",__LINE__); 605 break; 606 case OMX_CommandMarkBuffer: 607 OMX_PRDSP2(pCompPrivate->dbg, "%d :: AACDEC: Entered switch - Command Mark Buffer\n",__LINE__); 608 if(nParam > 0) { 609 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorBadPortIndex,"OMX_ErrorBadPortIndex"); 610 } 611 break; 612 613 default: 614 OMX_ERROR4(pCompPrivate->dbg, "%d :: AACDEC: Entered switch - Default\n",__LINE__); 615 pCompPrivate->cbInfo.EventHandler( 616 pHandle, pHandle->pApplicationPrivate, 617 OMX_EventError, 618 OMX_ErrorBadParameter, 619 OMX_TI_ErrorMinor, 620 "Invalid Command"); 621 break; 622 } 623 624 625 nRet = write (pCompPrivate->cmdPipe[1], &Cmd, sizeof(Cmd)); 626 if (nRet == -1) { 627 OMX_ERROR2(pCompPrivate->dbg, "EXITING:: write to cmd pipe failed!!!\n"); 628 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorInsufficientResources,"write failed: OMX_ErrorInsufficientResources"); 629 } 630 631 632 if (Cmd == OMX_CommandMarkBuffer) { 633 nRet = write (pCompPrivate->cmdDataPipe[1], &pCmdData,sizeof(OMX_PTR)); 634 if (nRet == -1) { 635 OMX_ERROR2(pCompPrivate->dbg, "EXITING:: write to cmd data pipe failed for MarkBuffer!!!\n"); 636 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorInsufficientResources,"write failed: OMX_ErrorInsufficientResources"); 637 } 638 } 639 else { 640 nRet = write (pCompPrivate->cmdDataPipe[1], &nParam, 641 sizeof(OMX_U32)); 642 if (nRet == -1) { 643 OMX_ERROR2(pCompPrivate->dbg, "EXITING:: command data pipe write failed\n"); 644 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorInsufficientResources,"write failed: OMX_ErrorInsufficientResources"); 645 } 646 } 647 648 /* if (nRet == -1) { 649 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorInsufficientResources,"OMX_ErrorInsufficientResources"); 650 } 651 */ 652 #ifdef DSP_RENDERING_ON 653 if(Cmd == OMX_CommandStateSet && nParam == OMX_StateExecuting) { 654 /* enable Tee device command*/ 655 cmd_data.hComponent = pHandle; 656 cmd_data.AM_Cmd = AM_CommandTDNDownlinkMode; 657 cmd_data.param1 = 0; 658 cmd_data.param2 = 0; 659 cmd_data.streamID = 0; 660 if((write(aacdec_fdwrite, &cmd_data, sizeof(cmd_data)))<0) { 661 eError = OMX_ErrorHardware; 662 goto EXIT; 663 } 664 } 665 #endif 666 667 /* add for acoustic control */ 668 EXIT: 669 if (pCompPrivate != NULL) { 670 OMX_PRINT1(pCompPrivate->dbg, "%d :: Returning = 0x%x\n", 671 __LINE__, eError); 672 } 673 return eError; 674 } 675 676 /*-------------------------------------------------------------------*/ 677 /* ================================================================================= * */ 678 /** 679 * @fn GetParameter() function gets the various parameter values of the 680 * component. 681 * 682 * @param hComp This is component handle. 683 * 684 * @param nParamIndex This is enumerate values which specifies what kind of 685 * information is to be retreived form the component. 686 * 687 * @param ComponentParameterStructure This is output argument which is 688 * filled by the component component 689 * 690 * @pre The component should be in loaded state. 691 * 692 * @post None 693 * 694 * @return OMX_ErrorNone = Successful Inirialization of the component\n 695 * OMX_ErrorBadPortIndex = Bad port index specified by application. 696 */ 697 /* ================================================================================ * */ 698 static OMX_ERRORTYPE GetParameter (OMX_HANDLETYPE hComp, 699 OMX_INDEXTYPE nParamIndex, 700 OMX_PTR ComponentParameterStructure) 701 { 702 OMX_ERRORTYPE eError = OMX_ErrorNone; 703 AACDEC_COMPONENT_PRIVATE *pComponentPrivate; 704 OMX_PARAM_PORTDEFINITIONTYPE *pParameterStructure; 705 pParameterStructure = (OMX_PARAM_PORTDEFINITIONTYPE*)ComponentParameterStructure; 706 707 AACDEC_OMX_CONF_CHECK_CMD(hComp,1,1) 708 pComponentPrivate = (AACDEC_COMPONENT_PRIVATE *)(((OMX_COMPONENTTYPE*)hComp)->pComponentPrivate); 709 OMX_PRINT1 (pComponentPrivate->dbg, "%d :: Entering OMX_GetParameter\n", __LINE__); 710 AACDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, ComponentParameterStructure, 1) 711 if (ComponentParameterStructure == NULL) { 712 eError = OMX_ErrorBadParameter; 713 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_ErrorBadPortIndex from GetParameter",__LINE__); 714 goto EXIT; 715 } 716 717 #ifdef _ERROR_PROPAGATION__ 718 if (pComponentPrivate->curState == OMX_StateInvalid){ 719 eError = OMX_ErrorInvalidState; 720 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_ErrorInvalidState from GetParameter",__LINE__); 721 goto EXIT; 722 } 723 #else 724 if(pComponentPrivate->curState == OMX_StateInvalid) { 725 OMX_ERROR4(pComponentPrivate->dbg, "%d ::Error returned from the Component\n", 726 __LINE__); 727 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorIncorrectStateOperation,"write failed: OMX_ErrorIncorrectStateOperation"); 728 } 729 #endif 730 731 switch(nParamIndex){ 732 case OMX_IndexParamAudioInit: 733 OMX_PRDSP2(pComponentPrivate->dbg, "%d :: SetParameter OMX_IndexParamAudioInit \n",__LINE__); 734 AACDEC_OMX_CONF_CHECK_CMD(pComponentPrivate->sPortParam ,1,1) 735 memcpy(ComponentParameterStructure, pComponentPrivate->sPortParam, sizeof(OMX_PORT_PARAM_TYPE)); 736 break; 737 738 case OMX_IndexParamPortDefinition: 739 OMX_PRDSP2(pComponentPrivate->dbg, "%d :: Entering OMX_IndexParamPortDefinition\n", __LINE__); 740 if(((OMX_PARAM_PORTDEFINITIONTYPE *)(ComponentParameterStructure))->nPortIndex == 741 pComponentPrivate->pPortDef[INPUT_PORT_AACDEC]->nPortIndex) { 742 memcpy(ComponentParameterStructure, pComponentPrivate->pPortDef[INPUT_PORT_AACDEC], sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); 743 } else if(((OMX_PARAM_PORTDEFINITIONTYPE *)(ComponentParameterStructure))->nPortIndex == 744 pComponentPrivate->pPortDef[OUTPUT_PORT_AACDEC]->nPortIndex) { 745 memcpy(ComponentParameterStructure, pComponentPrivate->pPortDef[OUTPUT_PORT_AACDEC], sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); 746 } else { 747 OMX_ERROR2(pComponentPrivate->dbg, "%d :: OMX_ErrorBadPortIndex from GetParameter \n",__LINE__); 748 eError = OMX_ErrorBadPortIndex; 749 } 750 break; 751 752 case OMX_IndexParamAudioPortFormat: 753 OMX_PRDSP2(pComponentPrivate->dbg, "%d :: Entering OMX_IndexParamAudioPortFormat\n", __LINE__); 754 if(((OMX_AUDIO_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nPortIndex == 755 pComponentPrivate->pPortDef[INPUT_PORT_AACDEC]->nPortIndex) { 756 if(((OMX_AUDIO_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nIndex > 757 pComponentPrivate->pCompPort[INPUT_PORT_AACDEC]->pPortFormat->nPortIndex) { 758 eError = OMX_ErrorNoMore; 759 } 760 else { 761 memcpy(ComponentParameterStructure, pComponentPrivate->pCompPort[INPUT_PORT_AACDEC]->pPortFormat, sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE)); 762 } 763 } 764 else if(((OMX_AUDIO_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nPortIndex == 765 pComponentPrivate->pPortDef[OUTPUT_PORT_AACDEC]->nPortIndex){ 766 if(((OMX_AUDIO_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nIndex > 767 pComponentPrivate->pCompPort[OUTPUT_PORT_AACDEC]->pPortFormat->nPortIndex) { 768 eError = OMX_ErrorNoMore; 769 } 770 else { 771 memcpy(ComponentParameterStructure, pComponentPrivate->pCompPort[OUTPUT_PORT_AACDEC]->pPortFormat, sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE)); 772 } 773 } 774 else { 775 OMX_ERROR2(pComponentPrivate->dbg, "%d :: OMX_ErrorBadPortIndex from GetParameter \n",__LINE__); 776 eError = OMX_ErrorBadPortIndex; 777 } 778 break; 779 780 case OMX_IndexParamAudioAac: 781 OMX_PRDSP2(pComponentPrivate->dbg, "%d :: Entering OMX_IndexParamAudioAac\n", __LINE__); 782 if(((OMX_AUDIO_PARAM_AACPROFILETYPE *)(ComponentParameterStructure))->nPortIndex == 783 pComponentPrivate->aacParams->nPortIndex) { 784 memcpy(ComponentParameterStructure, pComponentPrivate->aacParams, sizeof(OMX_AUDIO_PARAM_AACPROFILETYPE)); 785 } else if(((OMX_AUDIO_PARAM_PCMMODETYPE*)(ComponentParameterStructure))->nPortIndex == 786 pComponentPrivate->pcmParams->nPortIndex) { 787 memcpy(ComponentParameterStructure, pComponentPrivate->pcmParams, sizeof(OMX_AUDIO_PARAM_PCMMODETYPE)); 788 789 } else { 790 OMX_ERROR2(pComponentPrivate->dbg, "%d :: OMX_ErrorBadPortIndex from GetParameter \n",__LINE__); 791 eError = OMX_ErrorBadPortIndex; 792 } 793 break; 794 795 case OMX_IndexParamAudioPcm: 796 OMX_PRDSP2(pComponentPrivate->dbg, "%d :: Entering OMX_IndexParamAudioPcm\n", __LINE__); 797 AACDEC_OMX_CONF_CHECK_CMD(pComponentPrivate->pcmParams ,1,1) 798 memcpy(ComponentParameterStructure,pComponentPrivate->pcmParams,sizeof(OMX_AUDIO_PARAM_PCMMODETYPE)); 799 break; 800 801 case OMX_IndexParamCompBufferSupplier: 802 OMX_PRDSP2(pComponentPrivate->dbg, "%d :: Entering OMX_IndexParamCompBufferSupplier\n", __LINE__); 803 if(((OMX_PARAM_BUFFERSUPPLIERTYPE *)(ComponentParameterStructure))->nPortIndex == OMX_DirInput) { 804 OMX_PRINT2(pComponentPrivate->dbg, ":: GetParameter OMX_IndexParamCompBufferSupplier \n"); 805 } 806 else if(((OMX_PARAM_BUFFERSUPPLIERTYPE *)(ComponentParameterStructure))->nPortIndex == OMX_DirOutput) { 807 OMX_PRINT2(pComponentPrivate->dbg, ":: GetParameter OMX_IndexParamCompBufferSupplier \n"); 808 } 809 else { 810 OMX_ERROR2(pComponentPrivate->dbg, ":: OMX_ErrorBadPortIndex from GetParameter"); 811 eError = OMX_ErrorBadPortIndex; 812 } 813 break; 814 815 case OMX_IndexParamVideoInit: 816 case OMX_IndexParamImageInit: 817 case OMX_IndexParamOtherInit: 818 #ifdef ANDROID 819 OMX_PRINT2(pComponentPrivate->dbg, "%d :: Entering OMX_IndexParamVideoInit\n", __LINE__); 820 OMX_PRINT2(pComponentPrivate->dbg, "%d :: Entering OMX_IndexParamImageInit/OtherInit\n", __LINE__); 821 AACDEC_OMX_CONF_CHECK_CMD(pComponentPrivate->sPortParam ,1,1) 822 memcpy(ComponentParameterStructure,pComponentPrivate->sPortParam,sizeof(OMX_PORT_PARAM_TYPE)); 823 eError = OMX_ErrorNone; 824 #else 825 eError = OMX_ErrorUnsupportedIndex; 826 #endif 827 break; 828 829 830 case OMX_IndexParamPriorityMgmt: 831 OMX_PRDSP2(pComponentPrivate->dbg, "%d :: Entering OMX_IndexParamPriorityMgmt\n", __LINE__); 832 AACDEC_OMX_CONF_CHECK_CMD(pComponentPrivate->pPriorityMgmt ,1,1) 833 memcpy(ComponentParameterStructure, pComponentPrivate->pPriorityMgmt, sizeof(OMX_PRIORITYMGMTTYPE)); 834 break; 835 836 #ifdef ANDROID 837 case (OMX_INDEXTYPE) PV_OMX_COMPONENT_CAPABILITY_TYPE_INDEX: 838 { 839 OMX_PRDSP2(pComponentPrivate->dbg, "Entering PV_OMX_COMPONENT_CAPABILITY_TYPE_INDEX::%d\n", __LINE__); 840 PV_OMXComponentCapabilityFlagsType* pCap_flags = (PV_OMXComponentCapabilityFlagsType *) ComponentParameterStructure; 841 if (NULL == pCap_flags) 842 { 843 OMX_ERROR4(pComponentPrivate->dbg, "%d :: ERROR PV_OMX_COMPONENT_CAPABILITY_TYPE_INDEX\n", __LINE__); 844 eError = OMX_ErrorBadParameter; 845 goto EXIT; 846 } 847 OMX_PRDSP2(pComponentPrivate->dbg, "%d :: Copying PV_OMX_COMPONENT_CAPABILITY_TYPE_INDEX\n", __LINE__); 848 memcpy(pCap_flags, &(pComponentPrivate->iPVCapabilityFlags), sizeof(PV_OMXComponentCapabilityFlagsType)); 849 eError = OMX_ErrorNone; 850 } 851 break; 852 #endif 853 854 855 default: 856 eError = OMX_ErrorUnsupportedIndex; 857 break; 858 } 859 EXIT: 860 if (pComponentPrivate != NULL) { 861 OMX_PRINT1(pComponentPrivate->dbg, "%d :: Returning = 0x%x\n", 862 __LINE__, eError); 863 } 864 return eError; 865 } 866 867 868 /* ================================================================================= * */ 869 /** 870 * @fn SetParameter() function sets the various parameter values of the 871 * component. 872 * 873 * @param hComp This is component handle. 874 * 875 * @param nParamIndex This is enumerate values which specifies what kind of 876 * information is to be set for the component. 877 * 878 * @param ComponentParameterStructure This is input argument which contains 879 * the values to be set for the component. 880 * 881 * @pre The component should be in loaded state. 882 * 883 * @post None 884 * 885 * @return OMX_ErrorNone = Successful Inirialization of the component\n 886 * OMX_ErrorBadPortIndex = Bad port index specified by application. 887 */ 888 /* ================================================================================ * */ 889 static OMX_ERRORTYPE SetParameter (OMX_HANDLETYPE hComp, 890 OMX_INDEXTYPE nParamIndex, 891 OMX_PTR pCompParam) 892 { 893 OMX_ERRORTYPE eError = OMX_ErrorNone; 894 OMX_COMPONENTTYPE* pHandle= (OMX_COMPONENTTYPE*)hComp; 895 AACDEC_COMPONENT_PRIVATE *pComponentPrivate; 896 OMX_AUDIO_PARAM_PORTFORMATTYPE* pComponentParam = NULL; 897 OMX_PARAM_PORTDEFINITIONTYPE *pComponentParamPort = NULL; 898 OMX_AUDIO_PARAM_AACPROFILETYPE *pCompAacParam = NULL; 899 OMX_AUDIO_PARAM_PCMMODETYPE *pCompPcmParam = NULL; 900 OMX_PARAM_COMPONENTROLETYPE *pRole; 901 OMX_PARAM_BUFFERSUPPLIERTYPE sBufferSupplier; 902 903 AACDEC_OMX_CONF_CHECK_CMD(hComp,1,1) 904 pComponentPrivate = (AACDEC_COMPONENT_PRIVATE *)(((OMX_COMPONENTTYPE*)hComp)->pComponentPrivate); 905 906 AACDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, pCompParam, 1) 907 908 if (pComponentPrivate->curState != OMX_StateLoaded) { 909 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorIncorrectStateOperation,"OMX_ErrorIncorrectStateOperation"); 910 } 911 912 #ifdef _ERROR_PROPAGATION__ 913 if (pComponentPrivate->curState == OMX_StateInvalid){ 914 eError = OMX_ErrorInvalidState; 915 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_ErrorInvalidState from SetParameter",__LINE__); 916 goto EXIT; 917 } 918 #endif 919 920 switch(nParamIndex) { 921 case OMX_IndexParamAudioPortFormat: 922 { 923 pComponentParam = (OMX_AUDIO_PARAM_PORTFORMATTYPE *)pCompParam; 924 if ( pComponentParam->nPortIndex == pComponentPrivate->pCompPort[INPUT_PORT_AACDEC]->pPortFormat->nPortIndex ) { 925 memcpy(pComponentPrivate->pCompPort[INPUT_PORT_AACDEC]->pPortFormat, pComponentParam, sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE)); 926 } else if ( pComponentParam->nPortIndex == pComponentPrivate->pCompPort[OUTPUT_PORT_AACDEC]->pPortFormat->nPortIndex ) { 927 memcpy(pComponentPrivate->pCompPort[OUTPUT_PORT_AACDEC]->pPortFormat, pComponentParam, sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE)); 928 } else { 929 OMX_ERROR2(pComponentPrivate->dbg, "%d :: OMX_ErrorBadPortIndex from SetParameter",__LINE__); 930 eError = OMX_ErrorBadPortIndex; 931 } 932 } 933 break; 934 case OMX_IndexParamAudioAac: 935 { 936 pCompAacParam = (OMX_AUDIO_PARAM_AACPROFILETYPE *)pCompParam; 937 if(pCompAacParam->nPortIndex == 0) { /* 0 means Input port */ 938 memcpy(((AACDEC_COMPONENT_PRIVATE*) 939 pHandle->pComponentPrivate)->aacParams, pCompAacParam, sizeof(OMX_AUDIO_PARAM_AACPROFILETYPE)); 940 } 941 else { 942 OMX_ERROR2(pComponentPrivate->dbg, "%d :: OMX_ErrorBadPortIndex from SetParameter",__LINE__); 943 eError = OMX_ErrorBadPortIndex; 944 } 945 } 946 break; 947 case OMX_IndexParamPortDefinition: 948 { 949 pComponentParamPort = (OMX_PARAM_PORTDEFINITIONTYPE *)pCompParam; 950 if (pComponentParamPort->nPortIndex == 0) { 951 if (pComponentParamPort->eDir != OMX_DirInput) { 952 OMX_ERROR4(pComponentPrivate->dbg, "%d :: Invalid input buffer Direction\n",__LINE__); 953 eError = OMX_ErrorBadParameter; 954 goto EXIT; 955 } 956 if (pComponentParamPort->format.audio.eEncoding != OMX_AUDIO_CodingAAC) { 957 OMX_ERROR4(pComponentPrivate->dbg, "%d :: Invalid format Parameter\n",__LINE__); 958 eError = OMX_ErrorBadParameter; 959 goto EXIT; 960 } 961 } else if (pComponentParamPort->nPortIndex == 1) { 962 if (pComponentParamPort->eDir != OMX_DirOutput) { 963 OMX_ERROR4(pComponentPrivate->dbg, "%d :: Invalid Output buffer Direction\n",__LINE__); 964 eError = OMX_ErrorBadParameter; 965 goto EXIT; 966 } 967 if (pComponentParamPort->format.audio.eEncoding != OMX_AUDIO_CodingPCM) { 968 OMX_ERROR4(pComponentPrivate->dbg, "%d :: Invalid format Parameter\n",__LINE__); 969 eError = OMX_ErrorBadParameter; 970 goto EXIT; 971 } 972 } else { 973 OMX_PRCOMM2(pComponentPrivate->dbg, "%d :: OMX_ErrorBadPortIndex from SetParameter",__LINE__); 974 eError = OMX_ErrorBadPortIndex; 975 } 976 OMX_PRINT2(pComponentPrivate->dbg, "%d :: SetParameter OMX_IndexParamPortDefinition \n",__LINE__); 977 if(((OMX_PARAM_PORTDEFINITIONTYPE *)(pCompParam))->nPortIndex == 978 pComponentPrivate->pPortDef[INPUT_PORT_AACDEC]->nPortIndex) { 979 OMX_PRINT2(pComponentPrivate->dbg, "%d :: SetParameter OMX_IndexParamPortDefinition \n",__LINE__); 980 memcpy(pComponentPrivate->pPortDef[INPUT_PORT_AACDEC], pCompParam,sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); 981 } 982 else if(((OMX_PARAM_PORTDEFINITIONTYPE *)(pCompParam))->nPortIndex == 983 pComponentPrivate->pPortDef[OUTPUT_PORT_AACDEC]->nPortIndex) { 984 OMX_PRINT2(pComponentPrivate->dbg, "%d :: SetParameter OMX_IndexParamPortDefinition \n",__LINE__); 985 memcpy(pComponentPrivate->pPortDef[OUTPUT_PORT_AACDEC], pCompParam, sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); 986 } 987 else { 988 OMX_ERROR2(pComponentPrivate->dbg, "%d :: OMX_ErrorBadPortIndex from SetParameter",__LINE__); 989 eError = OMX_ErrorBadPortIndex; 990 } 991 } 992 break; 993 case OMX_IndexParamPriorityMgmt: 994 { 995 OMX_PRDSP2(pComponentPrivate->dbg, "%d :: SetParameter OMX_IndexParamPriorityMgmt \n",__LINE__); 996 AACDEC_OMX_CONF_CHECK_CMD(pComponentPrivate->pPriorityMgmt,1,1) 997 memcpy(pComponentPrivate->pPriorityMgmt, (OMX_PRIORITYMGMTTYPE*)pCompParam, sizeof(OMX_PRIORITYMGMTTYPE)); 998 } 999 break; 1000 1001 case OMX_IndexParamAudioInit: 1002 OMX_PRDSP2(pComponentPrivate->dbg, "%d :: SetParameter OMX_IndexParamAudioInit \n",__LINE__); 1003 AACDEC_OMX_CONF_CHECK_CMD(pComponentPrivate->sPortParam, 1,1) 1004 memcpy(pComponentPrivate->sPortParam, (OMX_PORT_PARAM_TYPE*)pCompParam, sizeof(OMX_PORT_PARAM_TYPE)); 1005 break; 1006 1007 case OMX_IndexParamStandardComponentRole: 1008 if (pCompParam) { 1009 pRole = (OMX_PARAM_COMPONENTROLETYPE *)pCompParam; 1010 AACDEC_OMX_CONF_CHECK_CMD(pComponentPrivate->componentRole, 1,1) 1011 memcpy(pComponentPrivate->componentRole, (void *)pRole, sizeof(OMX_PARAM_COMPONENTROLETYPE)); 1012 } else { 1013 eError = OMX_ErrorBadParameter; 1014 } 1015 break; 1016 1017 case OMX_IndexParamAudioPcm: 1018 if(pCompParam){ 1019 pCompPcmParam = (OMX_AUDIO_PARAM_PCMMODETYPE *)pCompParam; 1020 AACDEC_OMX_CONF_CHECK_CMD(pComponentPrivate->pcmParams, 1,1) 1021 memcpy(pComponentPrivate->pcmParams, pCompPcmParam, sizeof(OMX_AUDIO_PARAM_PCMMODETYPE)); 1022 } 1023 else{ 1024 eError = OMX_ErrorBadParameter; 1025 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_ErrorBadParameter from SetParameter",__LINE__); 1026 } 1027 if (((OMX_AUDIO_PARAM_PCMMODETYPE *)(pCompParam))->nBitPerSample == 24) { 1028 pComponentPrivate->nOpBit = 1; 1029 } 1030 else { 1031 pComponentPrivate->nOpBit = 0; 1032 } 1033 break; 1034 1035 case OMX_IndexParamCompBufferSupplier: 1036 if(((OMX_PARAM_PORTDEFINITIONTYPE *)(pCompParam))->nPortIndex == 1037 pComponentPrivate->pPortDef[INPUT_PORT_AACDEC]->nPortIndex) { 1038 OMX_PRBUFFER2(pComponentPrivate->dbg, ":: SetParameter OMX_IndexParamCompBufferSupplier \n"); 1039 sBufferSupplier.eBufferSupplier = OMX_BufferSupplyInput; 1040 memcpy(&sBufferSupplier, pCompParam, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE)); 1041 1042 } 1043 else if(((OMX_PARAM_PORTDEFINITIONTYPE *)(pCompParam))->nPortIndex == 1044 pComponentPrivate->pPortDef[OUTPUT_PORT_AACDEC]->nPortIndex) { 1045 OMX_PRBUFFER2(pComponentPrivate->dbg, ":: SetParameter OMX_IndexParamCompBufferSupplier \n"); 1046 sBufferSupplier.eBufferSupplier = OMX_BufferSupplyOutput; 1047 memcpy(&sBufferSupplier, pCompParam, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE)); 1048 } 1049 else { 1050 OMX_ERROR2(pComponentPrivate->dbg, ":: OMX_ErrorBadPortIndex from SetParameter"); 1051 eError = OMX_ErrorBadPortIndex; 1052 } 1053 break; 1054 default: 1055 OMX_ERROR2(pComponentPrivate->dbg, "%d :: SetParameter OMX_ErrorUnsupportedIndex \n",__LINE__); 1056 eError = OMX_ErrorUnsupportedIndex; 1057 break; 1058 } 1059 EXIT: 1060 if (pComponentPrivate != NULL) { 1061 OMX_PRINT1(pComponentPrivate->dbg, "%d :: Returning = 0x%x\n", 1062 __LINE__, eError); 1063 } 1064 return eError; 1065 } 1066 1067 /*-------------------------------------------------------------------*/ 1068 /** 1069 * SetConfig() Sets the configraiton to the component 1070 * 1071 * @param hComp handle for this instance of the component 1072 * @param nConfigIndex 1073 * @param ComponentConfigStructure 1074 * 1075 * @retval OMX_NoError Success, ready to roll 1076 * OMX_Error_BadParameter The input parameter pointer is null 1077 **/ 1078 /*-------------------------------------------------------------------*/ 1079 1080 static OMX_ERRORTYPE SetConfig (OMX_HANDLETYPE hComp, 1081 OMX_INDEXTYPE nConfigIndex, 1082 OMX_PTR ComponentConfigStructure) 1083 { 1084 OMX_ERRORTYPE eError = OMX_ErrorNone; 1085 OMX_COMPONENTTYPE* pHandle = (OMX_COMPONENTTYPE*)hComp; 1086 AACDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 1087 TI_OMX_DSP_DEFINITION* pDspDefinition = NULL; 1088 OMX_S16* deviceString = NULL; 1089 TI_OMX_DATAPATH dataPath; 1090 OMX_AUDIO_PARAM_AACPROFILETYPE *aac_params = NULL; 1091 OMX_U32 pValues[4]; 1092 1093 AACDEC_OMX_CONF_CHECK_CMD(pHandle,1,1) 1094 pComponentPrivate = (AACDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 1095 AACDEC_OMX_CONF_CHECK_CMD(pComponentPrivate,1,1) 1096 1097 #ifdef _ERROR_PROPAGATION__ 1098 if (pComponentPrivate->curState == OMX_StateInvalid){ 1099 eError = OMX_ErrorInvalidState; 1100 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_ErrorBadParameter from SetConfig\n",__LINE__); 1101 goto EXIT; 1102 } 1103 #endif 1104 1105 switch (nConfigIndex) { 1106 case OMX_IndexParamAudioAac: 1107 aac_params = (OMX_AUDIO_PARAM_AACPROFILETYPE*)ComponentConfigStructure; 1108 if(aac_params->eAACProfile == OMX_AUDIO_AACObjectHE_PS){ 1109 pComponentPrivate->AACDEC_UALGParam->iEnablePS = 1; 1110 pComponentPrivate->AACDEC_UALGParam->DownSampleSbr = 1; 1111 1112 pValues[0] = IUALG_CMD_SETSTATUS; 1113 pValues[1] = (OMX_U32)pComponentPrivate->AACDEC_UALGParam; 1114 pValues[2] = sizeof(MPEG4AACDEC_UALGParams); 1115 1116 eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pComponentPrivate->pLcmlHandle)->pCodecinterfacehandle, 1117 EMMCodecControlAlgCtrl,(void *)pValues); 1118 if(eError != OMX_ErrorNone) { 1119 OMX_ERROR4(pComponentPrivate->dbg, "%d: Error Occurred in Codec StreamControl..\n",__LINE__); 1120 pComponentPrivate->curState = OMX_StateInvalid; 1121 pComponentPrivate->cbInfo.EventHandler(pHandle, 1122 pHandle->pApplicationPrivate, 1123 OMX_EventError, 1124 eError, 1125 OMX_TI_ErrorSevere, 1126 NULL); 1127 goto EXIT; 1128 } 1129 } 1130 if(aac_params->eAACProfile == OMX_AUDIO_AACObjectHE){ 1131 pComponentPrivate->AACDEC_UALGParam->iEnablePS = 0; 1132 pComponentPrivate->AACDEC_UALGParam->DownSampleSbr = 1; 1133 1134 pValues[0] = IUALG_CMD_SETSTATUS; 1135 pValues[1] = (OMX_U32)pComponentPrivate->AACDEC_UALGParam; 1136 pValues[2] = sizeof(MPEG4AACDEC_UALGParams); 1137 1138 eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pComponentPrivate->pLcmlHandle)->pCodecinterfacehandle, 1139 EMMCodecControlAlgCtrl,(void *)pValues); 1140 if(eError != OMX_ErrorNone) { 1141 OMX_ERROR4(pComponentPrivate->dbg, "%d: Error Occurred in Codec StreamControl..\n",__LINE__); 1142 pComponentPrivate->curState = OMX_StateInvalid; 1143 pComponentPrivate->cbInfo.EventHandler(pHandle, 1144 pHandle->pApplicationPrivate, 1145 OMX_EventError, 1146 eError, 1147 OMX_TI_ErrorSevere, 1148 NULL); 1149 goto EXIT; 1150 } 1151 } 1152 break; 1153 1154 case OMX_IndexCustomAacDecHeaderInfoConfig: 1155 { 1156 pDspDefinition = (TI_OMX_DSP_DEFINITION *)ComponentConfigStructure; 1157 if (pDspDefinition == NULL) { 1158 eError = OMX_ErrorBadParameter; 1159 OMX_PRINT1(pComponentPrivate->dbg, "%d :: OMX_ErrorBadParameter from SetConfig\n",__LINE__); 1160 goto EXIT; 1161 } 1162 pComponentPrivate->dasfmode = pDspDefinition->dasfMode; 1163 if(pDspDefinition->dasfMode == 2){ 1164 pComponentPrivate->dasfmode = 1; 1165 } 1166 OMX_PRDSP2(pComponentPrivate->dbg, "pComponentPrivate->dasfmode = %d\n",(int)pComponentPrivate->dasfmode); 1167 pComponentPrivate->framemode = pDspDefinition->framemode; 1168 OMX_PRDSP2(pComponentPrivate->dbg, "pComponentPrivate->framemode = %d\n",(int)pComponentPrivate->framemode); 1169 pComponentPrivate->streamID = pDspDefinition->streamId; 1170 break; 1171 } 1172 case OMX_IndexCustomAacDecDataPath: 1173 deviceString = (OMX_S16*)ComponentConfigStructure; 1174 if (deviceString == NULL) { 1175 eError = OMX_ErrorBadParameter; 1176 goto EXIT; 1177 } 1178 1179 dataPath = (TI_OMX_DATAPATH)*deviceString; 1180 1181 switch(dataPath) { 1182 case DATAPATH_APPLICATION: 1183 OMX_MMMIXER_DATAPATH(pComponentPrivate->sDeviceString, RENDERTYPE_DECODER, pComponentPrivate->streamID); 1184 1185 1186 break; 1187 1188 case DATAPATH_APPLICATION_RTMIXER: 1189 strcpy((char*)pComponentPrivate->sDeviceString,(char*)RTM_STRING); 1190 break; 1191 1192 case DATAPATH_ACDN: 1193 strcpy((char*)pComponentPrivate->sDeviceString,(char*)ACDN_STRING); 1194 break; 1195 1196 default: 1197 break; 1198 } 1199 break; 1200 1201 case OMX_IndexCustomDebug: 1202 OMX_DBG_SETCONFIG(pComponentPrivate->dbg, ComponentConfigStructure); 1203 break; 1204 1205 default: 1206 eError = OMX_ErrorUnsupportedIndex; 1207 break; 1208 } 1209 EXIT: 1210 if (pComponentPrivate != NULL) { 1211 OMX_PRINT1(pComponentPrivate->dbg, "%d :: Returning = 0x%x\n", 1212 __LINE__, eError); 1213 } 1214 return eError; 1215 } 1216 1217 1218 /* ================================================================================= * */ 1219 /** 1220 * @fn SetCallbacks() Sets application callbacks to the component 1221 * 1222 * @param pComponent This is component handle. 1223 * 1224 * @param pCallBacks Application callbacks 1225 * 1226 * @param pAppData Application specified private data. 1227 * 1228 * @pre None 1229 * 1230 * @post None 1231 * 1232 * @return OMX_ErrorNone = Successful Inirialization of the component 1233 * OMX_ErrorBadParameter = If callback argument is NULL. 1234 */ 1235 /* ================================================================================ * */ 1236 1237 static OMX_ERRORTYPE SetCallbacks (OMX_HANDLETYPE pComponent, 1238 OMX_CALLBACKTYPE* pCallBacks, 1239 OMX_PTR pAppData) 1240 { 1241 OMX_ERRORTYPE eError = OMX_ErrorNone; 1242 OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE*)pComponent; 1243 AACDEC_COMPONENT_PRIVATE *pComponentPrivate; 1244 1245 1246 AACDEC_OMX_CONF_CHECK_CMD(pHandle,1,1) 1247 pComponentPrivate = (AACDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 1248 1249 AACDEC_OMX_CONF_CHECK_CMD(pComponentPrivate,1,1) 1250 1251 AACDEC_OMX_CONF_CHECK_CMD(pCallBacks, pCallBacks->EventHandler, pCallBacks->EmptyBufferDone) 1252 AACDEC_OMX_CONF_CHECK_CMD(pCallBacks->FillBufferDone, 1, 1) 1253 1254 memcpy (&(pComponentPrivate->cbInfo), pCallBacks, sizeof(OMX_CALLBACKTYPE)); 1255 pHandle->pApplicationPrivate = pAppData; 1256 OMX_PRSTATE2(pComponentPrivate->dbg, "****************** Component State Set to Loaded\n\n"); 1257 pComponentPrivate->curState = OMX_StateLoaded; 1258 1259 EXIT: 1260 return eError; 1261 } 1262 1263 /* ================================================================================= * */ 1264 /** 1265 * @fn GetComponentVersion() Sets application callbacks to the component. Currently this 1266 * function is not implemented. 1267 * 1268 * @param hComp This is component handle. 1269 * 1270 * @param pComponentName This is component name. 1271 * 1272 * @param pComponentVersion This output argument will contain the component 1273 * version when this function exits successfully. 1274 * 1275 * @param pSpecVersion This is specification version. 1276 * 1277 * @param pComponentUUID This specifies the UUID of the component. 1278 * 1279 * @pre None 1280 * 1281 * @post None 1282 * 1283 * @return OMX_ErrorNone = Successful Inirialization of the component 1284 */ 1285 /* ================================================================================ * */ 1286 static OMX_ERRORTYPE GetComponentVersion (OMX_HANDLETYPE hComp, 1287 OMX_STRING pComponentName, 1288 OMX_VERSIONTYPE* pComponentVersion, 1289 OMX_VERSIONTYPE* pSpecVersion, 1290 OMX_UUIDTYPE* pComponentUUID) 1291 { 1292 OMX_ERRORTYPE eError = OMX_ErrorNone; 1293 OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE*) hComp; 1294 AACDEC_COMPONENT_PRIVATE *pComponentPrivate = (AACDEC_COMPONENT_PRIVATE *) pHandle->pComponentPrivate; 1295 1296 #ifdef _ERROR_PROPAGATION__ 1297 if (pComponentPrivate->curState == OMX_StateInvalid){ 1298 eError = OMX_ErrorInvalidState; 1299 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_ErrorInvalidState from GetComponentVersion",__LINE__); 1300 goto EXIT; 1301 } 1302 #endif 1303 1304 /* Copy component version structure */ 1305 if(pComponentVersion != NULL && pComponentName != NULL) { 1306 strcpy(pComponentName, pComponentPrivate->cComponentName); 1307 memcpy(pComponentVersion, &(pComponentPrivate->ComponentVersion.s), sizeof(pComponentPrivate->ComponentVersion.s)); 1308 } 1309 else { 1310 OMX_ERROR2(pComponentPrivate->dbg, "%d :: OMX_ErrorBadParameter from GetComponentVersion",__LINE__); 1311 eError = OMX_ErrorBadParameter; 1312 } 1313 1314 OMX_PRINT1(pComponentPrivate->dbg, "%d :: Returning = 0x%x\n",__LINE__,eError); 1315 EXIT: 1316 return eError; 1317 } 1318 1319 /* ================================================================================= * */ 1320 /** 1321 * @fn GetConfig() gets the configuration of the component depending on the value 1322 * of nConfigINdex. This function is currently not implemented. 1323 * 1324 * @param hComp This is component handle. 1325 * 1326 * @param nConfigIndex This is config index to get the configuration of 1327 * component. 1328 * 1329 * @param ComponentConfigStructure This is configuration structure that is filled 1330 * by the component depending on the value of nConfigIndex. 1331 * 1332 * @pre None 1333 * 1334 * @post None 1335 * 1336 * @return OMX_ErrorNone = Successful Inirialization of the component 1337 */ 1338 /* ================================================================================ * */ 1339 static OMX_ERRORTYPE GetConfig (OMX_HANDLETYPE hComp, 1340 OMX_INDEXTYPE nConfigIndex, 1341 OMX_PTR ComponentConfigStructure) 1342 { 1343 OMX_ERRORTYPE eError = OMX_ErrorNone; 1344 1345 AACDEC_COMPONENT_PRIVATE *pComponentPrivate; 1346 TI_OMX_STREAM_INFO *streamInfo; 1347 1348 1349 pComponentPrivate = (AACDEC_COMPONENT_PRIVATE *)(((OMX_COMPONENTTYPE*)hComp)->pComponentPrivate); 1350 1351 #ifdef _ERROR_PROPAGATION__ 1352 if (pComponentPrivate->curState == OMX_StateInvalid){ 1353 eError = OMX_ErrorInvalidState; 1354 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_ErrorInvalidState from GetConfig \n",__LINE__); 1355 goto EXIT; 1356 } 1357 #endif 1358 1359 OMX_MALLOC_GENERIC(streamInfo,TI_OMX_STREAM_INFO); 1360 1361 if(nConfigIndex == OMX_IndexCustomAacDecStreamIDConfig){ 1362 /* copy component info */ 1363 streamInfo->streamId = pComponentPrivate->streamID; 1364 memcpy(ComponentConfigStructure,streamInfo,sizeof(TI_OMX_STREAM_INFO)); 1365 } 1366 1367 1368 1369 else if (nConfigIndex == OMX_IndexParamAudioAac) { 1370 OMX_PRDSP2(pComponentPrivate->dbg, "%d :: GetConfig OMX_IndexParamAudioAac \n",__LINE__); 1371 if(((OMX_AUDIO_PARAM_AACPROFILETYPE *)(ComponentConfigStructure))->nPortIndex == 1372 pComponentPrivate->aacParams->nPortIndex) { 1373 memcpy(ComponentConfigStructure, pComponentPrivate->aacParams, 1374 sizeof(OMX_AUDIO_PARAM_AACPROFILETYPE)); 1375 } 1376 else if(((OMX_AUDIO_PARAM_AACPROFILETYPE *)(ComponentConfigStructure))->nPortIndex == 1377 pComponentPrivate->pcmParams->nPortIndex) { 1378 memcpy(ComponentConfigStructure, pComponentPrivate->pcmParams, 1379 sizeof(OMX_AUDIO_PARAM_AACPROFILETYPE)); 1380 } 1381 else { 1382 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_ErrorBadPortIndex from GetConfig \n",__LINE__); 1383 eError = OMX_ErrorBadPortIndex; 1384 } 1385 } 1386 1387 else if(nConfigIndex == OMX_IndexCustomDebug) { 1388 OMX_DBG_GETCONFIG(pComponentPrivate->dbg, ComponentConfigStructure); 1389 } 1390 OMX_MEMFREE_STRUCT(streamInfo); 1391 1392 EXIT: 1393 return eError; 1394 } 1395 1396 /*-------------------------------------------------------------------*/ 1397 /* ================================================================================= * */ 1398 /** 1399 * @fn GetState() Gets the current state of the component. 1400 * 1401 * @param pComponent This is component handle. 1402 * 1403 * @param pState This is the output argument that contains the state of the 1404 * component. 1405 * 1406 * @pre None 1407 * 1408 * @post None 1409 * 1410 * @return OMX_ErrorNone = Successful Inirialization of the component 1411 * OMX_ErrorBadParameter = if output argument is NULL. 1412 */ 1413 /* ================================================================================ * */ 1414 static OMX_ERRORTYPE GetState (OMX_HANDLETYPE pComponent, OMX_STATETYPE* pState) 1415 { 1416 OMX_ERRORTYPE eError = OMX_ErrorUndefined; 1417 OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent; 1418 1419 if (!pState) { 1420 OMXDBG_PRINT(stderr, ERROR, 4, 0, "%d :: About to exit GetState with bad parameter\n", __LINE__); 1421 eError = OMX_ErrorBadParameter; 1422 goto EXIT; 1423 } 1424 1425 AACDEC_OMX_CONF_CHECK_CMD(pHandle,1,1); 1426 if (pHandle && pHandle->pComponentPrivate) { 1427 *pState = ((AACDEC_COMPONENT_PRIVATE*) 1428 pHandle->pComponentPrivate)->curState; 1429 } else { 1430 OMXDBG_PRINT(stderr, STATE, 2, 0, "%d :: In GetState\n", __LINE__); 1431 OMXDBG_PRINT(stderr, STATE, 2, 0, "Component State Set to Loaded\n\n"); 1432 *pState = OMX_StateLoaded; 1433 } 1434 1435 eError = OMX_ErrorNone; 1436 1437 EXIT: 1438 return eError; 1439 } 1440 1441 /* ================================================================================= * */ 1442 /** 1443 * @fn EmptyThisBuffer() This function is used by application to sent the filled 1444 * input buffers to the component. 1445 * 1446 * @param pComponent This is component handle. 1447 * 1448 * @param pBuffer This is pointer to the buffer header that come from the 1449 * application. 1450 * 1451 * @pre None 1452 * 1453 * @post None 1454 * 1455 * @return OMX_ErrorNone = Successful exit of the function 1456 * OMX_ErrorBadParameter = Bad input argument 1457 * OMX_ErrorBadPortIndex = Bad port index supplied by the 1458 * application 1459 */ 1460 /* ================================================================================ * */ 1461 static OMX_ERRORTYPE EmptyThisBuffer (OMX_HANDLETYPE pComponent, 1462 OMX_BUFFERHEADERTYPE* pBuffer) 1463 { 1464 OMX_ERRORTYPE eError = OMX_ErrorNone; 1465 OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent; 1466 AACDEC_COMPONENT_PRIVATE *pComponentPrivate = (AACDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 1467 OMX_PARAM_PORTDEFINITIONTYPE *pPortDef; 1468 int ret=0; 1469 pPortDef = ((AACDEC_COMPONENT_PRIVATE*)pComponentPrivate)->pPortDef[INPUT_PORT_AACDEC]; 1470 1471 1472 #ifdef _ERROR_PROPAGATION__ 1473 if (pComponentPrivate->curState == OMX_StateInvalid){ 1474 eError = OMX_ErrorInvalidState; 1475 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_ErrorInvalidState from EmptyThisBuffer\n", __LINE__); 1476 goto EXIT; 1477 } 1478 #endif 1479 #ifdef __PERF_INSTRUMENTATION__ 1480 PERF_ReceivedFrame(pComponentPrivate->pPERF, 1481 pBuffer->pBuffer, 1482 pBuffer->nFilledLen, 1483 PERF_ModuleHLMM); 1484 #endif 1485 1486 if(!pPortDef->bEnabled) { 1487 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorIncorrectStateOperation,"OMX_ErrorIncorrectStateOperation"); 1488 } 1489 1490 if (pBuffer == NULL) { 1491 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorBadParameter,"OMX_ErrorBadParameter"); 1492 } 1493 1494 if (pBuffer->nSize != sizeof(OMX_BUFFERHEADERTYPE)) { 1495 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorBadParameter,"Bad Size"); 1496 } 1497 1498 if (pBuffer->nInputPortIndex != INPUT_PORT_AACDEC) { 1499 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorBadPortIndex,"OMX_ErrorBadPortIndex"); 1500 } 1501 1502 1503 if (pBuffer->nVersion.nVersion != pComponentPrivate->nVersion) { 1504 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorVersionMismatch,"OMX_ErrorVersionMismatch"); 1505 } 1506 1507 if(pComponentPrivate->curState != OMX_StateExecuting && pComponentPrivate->curState != OMX_StatePause) { 1508 OMX_PRSTATE2(pComponentPrivate->dbg, "%d pComponentPrivate->curState = %d \n",__LINE__,pComponentPrivate->curState); 1509 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorIncorrectStateOperation,"OMX_ErrorIncorrectStateOperation"); 1510 } 1511 1512 OMX_PRBUFFER2(pComponentPrivate->dbg, "\n------------------------------------------\n\n"); 1513 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: Component Sending Filled ip buff %p to Component Thread\n",__LINE__,pBuffer); 1514 OMX_PRBUFFER2(pComponentPrivate->dbg, "\n------------------------------------------\n\n"); 1515 1516 if (pComponentPrivate->bBypassDSP == 0) { 1517 pComponentPrivate->app_nBuf--; 1518 } 1519 1520 pComponentPrivate->pMarkData = pBuffer->pMarkData; 1521 pComponentPrivate->hMarkTargetComponent = pBuffer->hMarkTargetComponent; 1522 1523 ret = write (pComponentPrivate->dataPipe[1], &pBuffer,sizeof(OMX_BUFFERHEADERTYPE*)); 1524 if (ret == -1) { 1525 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorHardware,"write failed: OMX_ErrorHardware"); 1526 } 1527 else 1528 { 1529 pComponentPrivate->nUnhandledEmptyThisBuffers++; 1530 pComponentPrivate->nEmptyThisBufferCount++; 1531 } 1532 1533 EXIT: 1534 return eError; 1535 } 1536 1537 /*-------------------------------------------------------------------*/ 1538 /** 1539 * FillThisBuffer() This callback is used to send the output buffer to 1540 * the component 1541 * 1542 * @param pComponent handle for this instance of the component 1543 * @param nPortIndex output port number 1544 * @param pBuffer buffer to be sent to codec 1545 * 1546 * @retval OMX_NoError Success, ready to roll 1547 * OMX_Error_BadParameter The INPUT_PORT_AACDEC parameter pointer is null 1548 **/ 1549 /*-------------------------------------------------------------------*/ 1550 1551 static OMX_ERRORTYPE FillThisBuffer (OMX_HANDLETYPE pComponent, 1552 OMX_BUFFERHEADERTYPE* pBuffer) 1553 { 1554 OMX_ERRORTYPE eError = OMX_ErrorNone; 1555 OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent; 1556 AACDEC_COMPONENT_PRIVATE *pComponentPrivate = (AACDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 1557 int nRet=0; 1558 OMX_PARAM_PORTDEFINITIONTYPE *pPortDef; 1559 1560 OMX_PRBUFFER2(pComponentPrivate->dbg, "\n------------------------------------------\n\n"); 1561 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: Component Sending Emptied op buff %p to Component Thread\n",__LINE__,pBuffer); 1562 OMX_PRBUFFER2(pComponentPrivate->dbg, "\n------------------------------------------\n\n"); 1563 1564 pPortDef = ((AACDEC_COMPONENT_PRIVATE*)pComponentPrivate)->pPortDef[OUTPUT_PORT_AACDEC]; 1565 1566 #ifdef _ERROR_PROPAGATION__ 1567 if (pComponentPrivate->curState == OMX_StateInvalid){ 1568 eError = OMX_ErrorInvalidState; 1569 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_ErrorInvalidState from FillThisBuffer\n", __LINE__); 1570 goto EXIT; 1571 } 1572 #endif 1573 #ifdef __PERF_INSTRUMENTATION__ 1574 PERF_ReceivedFrame(pComponentPrivate->pPERF, 1575 pBuffer->pBuffer, 1576 0, 1577 PERF_ModuleHLMM); 1578 #endif 1579 1580 if(!pPortDef->bEnabled) { 1581 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorIncorrectStateOperation,"write failed: OMX_ErrorIncorrectStateOperation"); 1582 } 1583 1584 if (pBuffer == NULL) { 1585 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorBadParameter,"write failed: OMX_ErrorBadParameter"); 1586 } 1587 1588 if (pBuffer->nSize != sizeof(OMX_BUFFERHEADERTYPE)) { 1589 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: EmptyThisBuffer: Bad Size\n",__LINE__); 1590 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorBadParameter,"write failed: Bad Size"); 1591 } 1592 1593 if (pBuffer->nOutputPortIndex != OUTPUT_PORT_AACDEC) { 1594 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: EmptyThisBuffer: BadPortIndex\n",__LINE__); 1595 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorBadPortIndex,"write failed: BadPortIndex"); 1596 } 1597 1598 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d::pBuffer->nVersion.nVersion:%lu\n",__LINE__,pBuffer->nVersion.nVersion); 1599 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d::pComponentPrivate->nVersion:%lu\n",__LINE__,pComponentPrivate->nVersion); 1600 if (pBuffer->nVersion.nVersion != pComponentPrivate->nVersion) { 1601 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: FillThisBuffer: BufferHeader Version Mismatch\n",__LINE__); 1602 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d::pBuffer->nVersion.nVersion:%lu\n",__LINE__,pBuffer->nVersion.nVersion); 1603 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d::pComponentPrivate->nVersion:%lu\n",__LINE__,pComponentPrivate->nVersion); 1604 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorVersionMismatch,"write failed: OMX_ErrorVersionMismatch"); 1605 } 1606 if(pComponentPrivate->curState != OMX_StateExecuting && pComponentPrivate->curState != OMX_StatePause) { 1607 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorIncorrectStateOperation,"write failed: OMX_ErrorIncorrectStateOperation"); 1608 } 1609 1610 pBuffer->nFilledLen = 0; 1611 1612 if (pComponentPrivate->bBypassDSP == 0) { 1613 pComponentPrivate->app_nBuf--; 1614 } 1615 1616 if(pComponentPrivate->pMarkBuf){ 1617 pBuffer->hMarkTargetComponent = pComponentPrivate->pMarkBuf->hMarkTargetComponent; 1618 pBuffer->pMarkData = pComponentPrivate->pMarkBuf->pMarkData; 1619 pComponentPrivate->pMarkBuf = NULL; 1620 } 1621 1622 if (pComponentPrivate->pMarkData) { 1623 pBuffer->hMarkTargetComponent = pComponentPrivate->hMarkTargetComponent; 1624 pBuffer->pMarkData = pComponentPrivate->pMarkData; 1625 pComponentPrivate->pMarkData = NULL; 1626 } 1627 1628 nRet = write (pComponentPrivate->dataPipe[1], &pBuffer,sizeof (OMX_BUFFERHEADERTYPE*)); 1629 if (nRet == -1) { 1630 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorHardware,"write failed: OMX_ErrorHardware"); 1631 } 1632 else 1633 { 1634 pComponentPrivate->nUnhandledFillThisBuffers++; 1635 pComponentPrivate->nFillThisBufferCount++; 1636 } 1637 1638 EXIT: 1639 return eError; 1640 } 1641 1642 /* ================================================================================= * */ 1643 /** 1644 * @fn ComponentDeInit() This function deinitializes the component. It is called 1645 * from OMX Core, not by application. Albeit, Application does call 1646 * OMX_FreeHandle of OMX Core and which in turn calls this function. 1647 * 1648 * @param pHandle This is component handle. 1649 * 1650 * @pre None 1651 * 1652 * @post This function should clean or free as much resources as 1653 * possible. 1654 * 1655 * @return OMX_ErrorNone = On Success 1656 * Appropriate error number in case any error happens. 1657 */ 1658 /* ================================================================================ * */ 1659 static OMX_ERRORTYPE ComponentDeInit(OMX_HANDLETYPE pHandle) 1660 { 1661 OMX_ERRORTYPE eError = OMX_ErrorNone; 1662 OMX_ERRORTYPE eError1 = OMX_ErrorNone; 1663 OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)pHandle; 1664 AACDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 1665 OMX_ERRORTYPE threadError = OMX_ErrorNone; 1666 int pthreadError = 0; 1667 struct OMX_TI_Debug dbg; 1668 1669 AACDEC_OMX_CONF_CHECK_CMD(pComponent,1,1) 1670 pComponentPrivate = (AACDEC_COMPONENT_PRIVATE *)pComponent->pComponentPrivate; 1671 AACDEC_OMX_CONF_CHECK_CMD(pComponentPrivate,1,1) 1672 dbg = pComponentPrivate->dbg; 1673 1674 #ifdef __PERF_INSTRUMENTATION__ 1675 PERF_Boundary(pComponentPrivate->pPERF,PERF_BoundaryStart | PERF_BoundaryCleanup); 1676 #endif 1677 1678 #ifdef DSP_RENDERING_ON 1679 close(aacdec_fdwrite); 1680 close(aacdec_fdread); 1681 #endif 1682 1683 #ifdef RESOURCE_MANAGER_ENABLED 1684 eError = RMProxy_NewSendCommand(pHandle, RMProxy_FreeResource, OMX_AAC_Decoder_COMPONENT, 0, 3456, NULL); 1685 if (eError != OMX_ErrorNone) { 1686 OMX_ERROR4(dbg, "%d ::Error returned from destroy ResourceManagerProxy thread\n", 1687 __LINE__); 1688 } 1689 1690 eError1 = RMProxy_Deinitalize(); 1691 if (eError1 != OMX_ErrorNone) { 1692 OMX_ERROR4(dbg, ":: First Error in ComponentDeinit: From RMProxy_Deinitalize\n"); 1693 eError = eError1; 1694 } 1695 #endif 1696 1697 pComponentPrivate->bExitCompThrd = 1; 1698 write (pComponentPrivate->cmdPipe[1], &pComponentPrivate->bExitCompThrd, sizeof(OMX_U16)); 1699 pthreadError = pthread_join(pComponentPrivate->ComponentThread, (void*)&threadError); 1700 if(0 != pthreadError) { 1701 OMX_ERROR4(dbg, ":: First Error in ComponentDeinit: From pthread_join\n"); 1702 eError = OMX_ErrorHardware; 1703 goto EXIT; 1704 } 1705 if (OMX_ErrorNone != threadError && OMX_ErrorNone != eError) { 1706 eError = OMX_ErrorInsufficientResources; 1707 OMX_ERROR4(dbg, "%d :: Error while closing Component Thread\n",__LINE__); 1708 goto EXIT; 1709 } 1710 1711 eError1 = AACDEC_FreeCompResources(pHandle); 1712 if (OMX_ErrorNone != eError1) { 1713 if (OMX_ErrorNone == eError) { 1714 OMX_ERROR4(dbg, ":: First Error in ComponentDeinit: From FreeCompResources\n"); 1715 eError = eError1; 1716 } 1717 } 1718 1719 OMX_MEMFREE_STRUCT(pComponentPrivate->sDeviceString); 1720 1721 #ifdef __PERF_INSTRUMENTATION__ 1722 PERF_Boundary(pComponentPrivate->pPERF,PERF_BoundaryComplete | PERF_BoundaryCleanup); 1723 PERF_Done(pComponentPrivate->pPERF); 1724 #endif 1725 1726 OMXDBG_PRINT(stderr, BUFFER, 2, 0, ":: Freeing: pComponentPrivate = %p\n",pComponentPrivate); 1727 OMX_PRINT1(dbg, "::*********** ComponentDeinit is Done************** \n"); 1728 OMX_DBG_CLOSE(dbg); 1729 OMX_MEMFREE_STRUCT(pComponentPrivate); 1730 1731 1732 EXIT: 1733 return eError; 1734 } 1735 1736 1737 /* ================================================================================= * */ 1738 /** 1739 * @fn ComponentTunnelRequest() This function estabilishes the tunnel between two 1740 * components. This is not implemented currently. 1741 * 1742 * @param hComp Handle of this component. 1743 * 1744 * @param nPort Port of this component on which tunneling has to be done. 1745 * 1746 * @param hTunneledComp Handle of the component with which tunnel has to be 1747 * established. 1748 * 1749 * @param nTunneledPort Port of the tunneling component. 1750 * 1751 * @param pTunnelSetup Tunnel Setuup parameters. 1752 * 1753 * @pre None 1754 * 1755 * @post None 1756 * 1757 * @return OMX_ErrorNone = On Success 1758 * Appropriate error number in case any error happens. 1759 */ 1760 /* ================================================================================ * */ 1761 static OMX_ERRORTYPE ComponentTunnelRequest (OMX_HANDLETYPE hComp, 1762 OMX_U32 nPort, OMX_HANDLETYPE hTunneledComp, 1763 OMX_U32 nTunneledPort, 1764 OMX_TUNNELSETUPTYPE* pTunnelSetup) 1765 { 1766 OMX_ERRORTYPE eError = OMX_ErrorNone; 1767 eError = OMX_ErrorNotImplemented; 1768 return eError; 1769 } 1770 1771 1772 1773 /* ================================================================================= * */ 1774 /** 1775 * @fn AllocateBuffer() This function allocated the memory for the buffer onm 1776 * request from application. 1777 * 1778 * @param hComponent Handle of this component. 1779 * 1780 * @param pBuffer Pointer to the buffer header. 1781 * 1782 * @param nPortIndex Input port or Output port 1783 * 1784 * @param pAppPrivate Application private data. 1785 * 1786 * @param nSizeBytes Size of the buffer that is to be allocated. 1787 * 1788 * @pre None 1789 * 1790 * @post Requested buffer should get the memory allocated. 1791 * 1792 * @return OMX_ErrorNone = On Success 1793 * OMX_ErrorBadPortIndex = Bad port index from app 1794 */ 1795 /* ================================================================================ * */ 1796 static OMX_ERRORTYPE AllocateBuffer (OMX_IN OMX_HANDLETYPE hComponent, 1797 OMX_INOUT OMX_BUFFERHEADERTYPE** pBuffer, 1798 OMX_IN OMX_U32 nPortIndex, 1799 OMX_IN OMX_PTR pAppPrivate, 1800 OMX_IN OMX_U32 nSizeBytes) 1801 { 1802 OMX_PARAM_PORTDEFINITIONTYPE *pPortDef; 1803 AACDEC_COMPONENT_PRIVATE *pComponentPrivate; 1804 OMX_ERRORTYPE eError = OMX_ErrorNone; 1805 OMX_BUFFERHEADERTYPE *pBufferHeader = NULL; 1806 1807 AACDEC_OMX_CONF_CHECK_CMD(hComponent,1,1); 1808 pComponentPrivate = (AACDEC_COMPONENT_PRIVATE *)(((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate); 1809 1810 #ifdef _ERROR_PROPAGATION__ 1811 if (pComponentPrivate->curState == OMX_StateInvalid){ 1812 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_ErrorInvalidState from AllocateBuffer\n", __LINE__); 1813 eError = OMX_ErrorInvalidState; 1814 goto EXIT; 1815 } 1816 #endif 1817 1818 AACDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1); 1819 1820 pPortDef = ((AACDEC_COMPONENT_PRIVATE*)pComponentPrivate)->pPortDef[nPortIndex]; 1821 1822 AACDEC_OMX_CONF_CHECK_CMD(pPortDef, 1, 1); 1823 if (!pPortDef->bEnabled) { 1824 pComponentPrivate->AlloBuf_waitingsignal = 1; 1825 #ifndef UNDER_CE 1826 pthread_mutex_lock(&pComponentPrivate->AlloBuf_mutex); 1827 pthread_cond_wait(&pComponentPrivate->AlloBuf_threshold, &pComponentPrivate->AlloBuf_mutex); 1828 pthread_mutex_unlock(&pComponentPrivate->AlloBuf_mutex); 1829 #else 1830 OMX_WaitForEvent(&(pComponentPrivate->AlloBuf_event)); 1831 #endif 1832 } 1833 1834 OMX_MALLOC_GENERIC(pBufferHeader, OMX_BUFFERHEADERTYPE); 1835 memset((pBufferHeader), 0x0, sizeof(OMX_BUFFERHEADERTYPE)); 1836 1837 OMX_MALLOC_SIZE_DSPALIGN(pBufferHeader->pBuffer,nSizeBytes,OMX_U8); 1838 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: Malloced = %p\n",__LINE__,pBufferHeader->pBuffer); 1839 pBufferHeader->nVersion.nVersion = AACDEC_BUFHEADER_VERSION; 1840 1841 OMX_PRBUFFER2(pComponentPrivate->dbg, "********************************************\n"); 1842 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: Allocated BufHeader %p Buffer = %p, on port %ld\n",__LINE__,pBufferHeader,pBufferHeader->pBuffer, nPortIndex); 1843 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: Ip Num = %ld\n",__LINE__,pComponentPrivate->pInputBufferList->numBuffers); 1844 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: Op Num = %ld\n",__LINE__,pComponentPrivate->pOutputBufferList->numBuffers); 1845 OMX_PRBUFFER2(pComponentPrivate->dbg, "********************************************\n"); 1846 1847 pBufferHeader->pAppPrivate = pAppPrivate; 1848 pBufferHeader->pPlatformPrivate = pComponentPrivate; 1849 pBufferHeader->nAllocLen = nSizeBytes; 1850 1851 1852 if (nPortIndex == INPUT_PORT_AACDEC) { 1853 pBufferHeader->nInputPortIndex = nPortIndex; 1854 pBufferHeader->nOutputPortIndex = -1; 1855 pComponentPrivate->pInputBufferList->pBufHdr[pComponentPrivate->pInputBufferList->numBuffers] = pBufferHeader; 1856 pComponentPrivate->pInputBufferList->bBufferPending[pComponentPrivate->pInputBufferList->numBuffers] = 0; 1857 OMX_PRBUFFER2(pComponentPrivate->dbg, "pComponentPrivate->pInputBufferList->pBufHdr[%ld] = %p\n", 1858 pComponentPrivate->pInputBufferList->numBuffers,pComponentPrivate->pInputBufferList->pBufHdr[pComponentPrivate->pInputBufferList->numBuffers]); 1859 pComponentPrivate->pInputBufferList->bufferOwner[pComponentPrivate->pInputBufferList->numBuffers++] = 1; 1860 OMX_PRBUFFER2(pComponentPrivate->dbg, "pComponentPrivate->pInputBufferList->numBuffers = %ld\n",pComponentPrivate->pInputBufferList->numBuffers); 1861 OMX_PRBUFFER2(pComponentPrivate->dbg, "pPortDef->nBufferCountMin = %lu\n",pPortDef->nBufferCountMin); 1862 if (pComponentPrivate->pInputBufferList->numBuffers == pPortDef->nBufferCountActual) { 1863 pPortDef->bPopulated = 1; 1864 } 1865 } else if (nPortIndex == OUTPUT_PORT_AACDEC) { 1866 pBufferHeader->nInputPortIndex = -1; 1867 pBufferHeader->nOutputPortIndex = nPortIndex; 1868 pComponentPrivate->pOutputBufferList->pBufHdr[pComponentPrivate->pOutputBufferList->numBuffers] = pBufferHeader; 1869 pComponentPrivate->pOutputBufferList->bBufferPending[pComponentPrivate->pOutputBufferList->numBuffers] = 0; 1870 OMX_PRBUFFER2(pComponentPrivate->dbg, "pComponentPrivate->pOutputBufferList->pBufHdr[%lu] = %p\n",pComponentPrivate->pOutputBufferList->numBuffers,pComponentPrivate->pOutputBufferList->pBufHdr[pComponentPrivate->pOutputBufferList->numBuffers]); 1871 pComponentPrivate->pOutputBufferList->bufferOwner[pComponentPrivate->pOutputBufferList->numBuffers++] = 1; 1872 if (pComponentPrivate->pOutputBufferList->numBuffers == pPortDef->nBufferCountActual) { 1873 pPortDef->bPopulated = 1; 1874 } 1875 } else { 1876 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorBadPortIndex,"OMX_ErrorBadPortIndex"); 1877 } 1878 1879 if((pComponentPrivate->pPortDef[OUTPUT_PORT_AACDEC]->bPopulated == pComponentPrivate->pPortDef[OUTPUT_PORT_AACDEC]->bEnabled)&& 1880 (pComponentPrivate->pPortDef[INPUT_PORT_AACDEC]->bPopulated == pComponentPrivate->pPortDef[INPUT_PORT_AACDEC]->bEnabled) && 1881 (pComponentPrivate->InLoaded_readytoidle)){ 1882 pComponentPrivate->InLoaded_readytoidle = 0; 1883 #ifndef UNDER_CE 1884 pthread_mutex_lock(&pComponentPrivate->InLoaded_mutex); 1885 pthread_cond_signal(&pComponentPrivate->InLoaded_threshold); 1886 pthread_mutex_unlock(&pComponentPrivate->InLoaded_mutex); 1887 #else 1888 OMX_SignalEvent(&(pComponentPrivate->InLoaded_event)); 1889 #endif 1890 } 1891 1892 pBufferHeader->pAppPrivate = pAppPrivate; 1893 pBufferHeader->pPlatformPrivate = pComponentPrivate; 1894 pBufferHeader->nAllocLen = nSizeBytes; 1895 pBufferHeader->nVersion.s.nVersionMajor = AACDEC_MAJOR_VER; 1896 pBufferHeader->nVersion.s.nVersionMinor = AACDEC_MINOR_VER; 1897 pComponentPrivate->nVersion = pBufferHeader->nVersion.nVersion; 1898 pBufferHeader->nSize = sizeof(OMX_BUFFERHEADERTYPE); 1899 1900 *pBuffer = pBufferHeader; 1901 pComponentPrivate->bufAlloced = 1; 1902 1903 #ifdef __PERF_INSTRUMENTATION__ 1904 PERF_ReceivedBuffer(pComponentPrivate->pPERF,(*pBuffer)->pBuffer,nSizeBytes,PERF_ModuleMemory); 1905 #endif 1906 1907 if (pComponentPrivate->bEnableCommandPending && pPortDef->bPopulated) { 1908 SendCommand (pComponentPrivate->pHandle, 1909 OMX_CommandPortEnable, 1910 pComponentPrivate->bEnableCommandParam,NULL); 1911 } 1912 1913 EXIT: 1914 if(OMX_ErrorNone != eError) { 1915 OMX_PRINT1(pComponentPrivate->dbg, "%d :: ************* ERROR: Freeing Other Malloced Resources\n",__LINE__); 1916 OMX_MEMFREE_STRUCT_DSPALIGN(pBufferHeader->pBuffer, OMX_U8); 1917 OMX_MEMFREE_STRUCT(pBufferHeader); 1918 } 1919 return eError; 1920 } 1921 1922 /* ================================================================================= * */ 1923 /** 1924 * @fn FreeBuffer() This function frees the meomory of the buffer specified. 1925 * 1926 * @param hComponent Handle of this component. 1927 * 1928 * @param nPortIndex Input port or Output port 1929 * 1930 * @param pBuffer Pointer to the buffer header. 1931 * 1932 * @pre None 1933 * 1934 * @post Requested buffer should get the memory allocated. 1935 * 1936 * @return OMX_ErrorNone = On Success 1937 * OMX_ErrorBadPortIndex = Bad port index from app 1938 */ 1939 /* ================================================================================ * */ 1940 static OMX_ERRORTYPE FreeBuffer( 1941 OMX_IN OMX_HANDLETYPE hComponent, 1942 OMX_IN OMX_U32 nPortIndex, 1943 OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) 1944 { 1945 OMX_ERRORTYPE eError = OMX_ErrorNone; 1946 AACDEC_COMPONENT_PRIVATE * pComponentPrivate = NULL; 1947 OMX_U8* buff; 1948 int i; 1949 int inputIndex = -1; 1950 int outputIndex = -1; 1951 OMX_COMPONENTTYPE *pHandle; 1952 1953 1954 pComponentPrivate = (AACDEC_COMPONENT_PRIVATE *) (((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate); 1955 1956 pHandle = (OMX_COMPONENTTYPE *) pComponentPrivate->pHandle; 1957 OMX_PRINT1(pComponentPrivate->dbg, "%d :: pComponentPrivate = %p\n", __LINE__,pComponentPrivate); 1958 for (i=0; i < MAX_NUM_OF_BUFS_AACDEC; i++) { 1959 buff = (OMX_U8 *)pComponentPrivate->pInputBufferList->pBufHdr[i]; 1960 if (buff == (OMX_U8 *)pBuffer) { 1961 OMX_PRBUFFER2(pComponentPrivate->dbg, "Found matching input buffer\n"); 1962 OMX_PRBUFFER2(pComponentPrivate->dbg, "buff = %p\n",buff); 1963 OMX_PRBUFFER2(pComponentPrivate->dbg, "pBuffer = %p\n",pBuffer); 1964 inputIndex = i; 1965 break; 1966 } 1967 else { 1968 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: This is not a match\n",__LINE__); 1969 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: buff = %p\n",__LINE__,buff); 1970 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: pBuffer = %p\n",__LINE__,pBuffer); 1971 } 1972 } 1973 1974 for (i=0; i < MAX_NUM_OF_BUFS_AACDEC; i++) { 1975 buff = (OMX_U8 *)pComponentPrivate->pOutputBufferList->pBufHdr[i]; 1976 if (buff == (OMX_U8 *)pBuffer) { 1977 OMX_PRBUFFER2(pComponentPrivate->dbg, "Found matching output buffer\n"); 1978 OMX_PRBUFFER2(pComponentPrivate->dbg, "buff = %p\n",buff); 1979 OMX_PRBUFFER2(pComponentPrivate->dbg, "pBuffer = %p\n",pBuffer); 1980 outputIndex = i; 1981 break; 1982 } 1983 else { 1984 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: This is not a match\n",__LINE__); 1985 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: buff = %p\n",__LINE__,buff); 1986 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: pBuffer = %p\n",__LINE__,pBuffer); 1987 } 1988 } 1989 1990 1991 if (inputIndex != -1) { 1992 if (pComponentPrivate->pInputBufferList->bufferOwner[inputIndex] == 1) { 1993 OMX_MEMFREE_STRUCT_DSPALIGN(pComponentPrivate->pInputBufferList->pBufHdr[inputIndex]->pBuffer, OMX_U8); 1994 buff = NULL; 1995 } 1996 1997 #ifdef __PERF_INSTRUMENTATION__ 1998 PERF_SendingBuffer(pComponentPrivate->pPERF, 1999 pComponentPrivate->pInputBufferList->pBufHdr[inputIndex]->pBuffer, 2000 pComponentPrivate->pInputBufferList->pBufHdr[inputIndex]->nAllocLen, 2001 PERF_ModuleMemory); 2002 #endif 2003 2004 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d: Freeing: %p IP Buf Header\n\n",__LINE__, 2005 pComponentPrivate->pInputBufferList->pBufHdr[inputIndex]); 2006 2007 OMX_MEMFREE_STRUCT(pComponentPrivate->pInputBufferList->pBufHdr[inputIndex]); 2008 pComponentPrivate->pInputBufferList->pBufHdr[inputIndex] = NULL; 2009 pComponentPrivate->pInputBufferList->numBuffers--; 2010 2011 if (pComponentPrivate->pInputBufferList->numBuffers < 2012 pComponentPrivate->pPortDef[INPUT_PORT_AACDEC]->nBufferCountMin) { 2013 pComponentPrivate->pPortDef[INPUT_PORT_AACDEC]->bPopulated = OMX_FALSE; 2014 } 2015 2016 OMX_PRSTATE2(pComponentPrivate->dbg, "CurrentState = %d\nbLoadedCommandPending = %d\nInput port bEnabled = %d\n", 2017 pComponentPrivate->curState, 2018 pComponentPrivate->bLoadedCommandPending, 2019 pComponentPrivate->pPortDef[INPUT_PORT_AACDEC]->bEnabled); 2020 2021 if(pComponentPrivate->pPortDef[INPUT_PORT_AACDEC]->bEnabled && 2022 pComponentPrivate->bLoadedCommandPending == OMX_FALSE && 2023 !pComponentPrivate->reconfigInputPort && 2024 (pComponentPrivate->curState == OMX_StateIdle || 2025 pComponentPrivate->curState == OMX_StateExecuting || 2026 pComponentPrivate->curState == OMX_StatePause)) { 2027 OMX_ERROR4(pComponentPrivate->dbg, "OMX_EventError:: OMX_ErrorPortUnpopulated at line %d\n", __LINE__); 2028 pComponentPrivate->cbInfo.EventHandler( pHandle, 2029 pHandle->pApplicationPrivate, 2030 OMX_EventError, 2031 OMX_ErrorPortUnpopulated, 2032 nPortIndex, 2033 NULL); 2034 } 2035 } else if (outputIndex != -1) { 2036 if (pComponentPrivate->pOutputBufferList->bBufferPending[outputIndex]) { 2037 pComponentPrivate->numPendingBuffers++; 2038 } 2039 if (pComponentPrivate->pOutputBufferList->bufferOwner[outputIndex] == 1) { 2040 OMX_MEMFREE_STRUCT_DSPALIGN(pComponentPrivate->pOutputBufferList->pBufHdr[outputIndex]->pBuffer, OMX_U8); 2041 buff = NULL; 2042 } 2043 2044 #ifdef __PERF_INSTRUMENTATION__ 2045 PERF_SendingBuffer(pComponentPrivate->pPERF, 2046 pComponentPrivate->pOutputBufferList->pBufHdr[outputIndex]->pBuffer, 2047 pComponentPrivate->pOutputBufferList->pBufHdr[outputIndex]->nAllocLen, 2048 PERF_ModuleMemory); 2049 #endif 2050 2051 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d: Freeing: %p OP Buf Header\n\n",__LINE__, 2052 pComponentPrivate->pOutputBufferList->pBufHdr[outputIndex]); 2053 OMX_MEMFREE_STRUCT(pComponentPrivate->pOutputBufferList->pBufHdr[outputIndex]->pOutputPortPrivate); 2054 OMX_MEMFREE_STRUCT(pComponentPrivate->pOutputBufferList->pBufHdr[outputIndex]); 2055 pComponentPrivate->pOutputBufferList->pBufHdr[outputIndex] = NULL; 2056 pComponentPrivate->pOutputBufferList->numBuffers--; 2057 2058 OMX_PRBUFFER2(pComponentPrivate->dbg, "pComponentPrivate->pOutputBufferList->numBuffers = %lu\n",pComponentPrivate->pOutputBufferList->numBuffers); 2059 OMX_PRCOMM2(pComponentPrivate->dbg, "pComponentPrivate->pPortDef[OUTPUT_PORT_AACDEC]->nBufferCountMin = %lu\n",pComponentPrivate->pPortDef[OUTPUT_PORT_AACDEC]->nBufferCountMin); 2060 if (pComponentPrivate->pOutputBufferList->numBuffers < 2061 pComponentPrivate->pPortDef[OUTPUT_PORT_AACDEC]->nBufferCountMin) { 2062 2063 pComponentPrivate->pPortDef[OUTPUT_PORT_AACDEC]->bPopulated = OMX_FALSE; 2064 } 2065 2066 OMX_PRCOMM2(pComponentPrivate->dbg, "CurrentState = %d\nbLoadedCommandPending = %d\nOutput port bEnabled = %d\nreconfig = %d", 2067 pComponentPrivate->curState, 2068 pComponentPrivate->bLoadedCommandPending, 2069 pComponentPrivate->pPortDef[OUTPUT_PORT_AACDEC]->bEnabled, 2070 pComponentPrivate->reconfigOutputPort); 2071 if(pComponentPrivate->pPortDef[OUTPUT_PORT_AACDEC]->bEnabled && 2072 pComponentPrivate->bLoadedCommandPending == OMX_FALSE && 2073 !pComponentPrivate->reconfigOutputPort && 2074 (pComponentPrivate->curState == OMX_StateIdle || 2075 pComponentPrivate->curState == OMX_StateExecuting || 2076 pComponentPrivate->curState == OMX_StatePause)) { 2077 OMX_ERROR4(pComponentPrivate->dbg, "OMX_EventError:: OMX_ErrorPortUnpopulated at line %d\n", __LINE__); 2078 pComponentPrivate->cbInfo.EventHandler( pHandle, 2079 pHandle->pApplicationPrivate, 2080 OMX_EventError, 2081 OMX_ErrorPortUnpopulated, 2082 nPortIndex, 2083 NULL); 2084 } 2085 } 2086 else { 2087 OMX_ERROR2(pComponentPrivate->dbg, "%d::Returning OMX_ErrorBadParameter\n",__LINE__); 2088 eError = OMX_ErrorBadParameter; 2089 } 2090 if ((!pComponentPrivate->pInputBufferList->numBuffers && 2091 !pComponentPrivate->pOutputBufferList->numBuffers) && 2092 pComponentPrivate->InIdle_goingtoloaded) 2093 { 2094 pComponentPrivate->InIdle_goingtoloaded = 0; 2095 #ifndef UNDER_CE 2096 pthread_mutex_lock(&pComponentPrivate->InIdle_mutex); 2097 pthread_cond_signal(&pComponentPrivate->InIdle_threshold); 2098 pthread_mutex_unlock(&pComponentPrivate->InIdle_mutex); 2099 #else 2100 OMX_SignalEvent(&(pComponentPrivate->InIdle_event)); 2101 #endif 2102 } 2103 2104 pComponentPrivate->bufAlloced = 0; 2105 2106 if ((pComponentPrivate->bDisableCommandPending) && 2107 (pComponentPrivate->pInputBufferList->numBuffers == 0)) 2108 { 2109 OMX_PRCOMM2(pComponentPrivate->dbg, "calling command completed for input port disable\n"); 2110 pComponentPrivate->bDisableCommandPending = 0; 2111 pComponentPrivate->cbInfo.EventHandler( pComponentPrivate->pHandle, 2112 pComponentPrivate->pHandle->pApplicationPrivate, 2113 OMX_EventCmdComplete, 2114 OMX_CommandPortDisable, 2115 INPUT_PORT_AACDEC, 2116 NULL); 2117 } 2118 2119 2120 if ((pComponentPrivate->bDisableCommandPending) && 2121 (pComponentPrivate->pOutputBufferList->numBuffers == 0)) 2122 { 2123 OMX_PRCOMM2(pComponentPrivate->dbg, "calling command completed for output port disable\n"); 2124 pComponentPrivate->bDisableCommandPending = 0; 2125 pComponentPrivate->cbInfo.EventHandler( pComponentPrivate->pHandle, 2126 pComponentPrivate->pHandle->pApplicationPrivate, 2127 OMX_EventCmdComplete, 2128 OMX_CommandPortDisable, 2129 OUTPUT_PORT_AACDEC, 2130 NULL); 2131 } 2132 2133 2134 OMX_PRCOMM2(pComponentPrivate->dbg, "checking if port disable is pending\n"); 2135 OMX_PRDSP2(pComponentPrivate->dbg, "::::disableCommandPending = %ld\n",pComponentPrivate->bDisableCommandPending); 2136 OMX_PRDSP2(pComponentPrivate->dbg, "::::disableCommandParam = %ld\n",pComponentPrivate->bDisableCommandParam); 2137 OMX_PRBUFFER2(pComponentPrivate->dbg, "::::pOutputBufferList->numBuffers = %ld\n", pComponentPrivate->pOutputBufferList->numBuffers); 2138 OMX_PRBUFFER2(pComponentPrivate->dbg, "::::pInputBufferList->numBuffers = %ld\n", pComponentPrivate->pInputBufferList->numBuffers); 2139 2140 return eError; 2141 } 2142 2143 2144 /* ================================================================================= * */ 2145 /** 2146 * @fn UseBuffer() This function is called by application when app allocated the 2147 * memory for the buffer and sends it to application for use of component. 2148 * 2149 * @param hComponent Handle of this component. 2150 * 2151 * @param ppBufferHdr Double pointer to the buffer header. 2152 * 2153 * @param nPortIndex Input port or Output port 2154 * 2155 * @param pAppPrivate Application private data. 2156 * 2157 * @param nSizeBytes Size of the buffer that is to be allocated. 2158 * 2159 * @param pBuffer Pointer to data buffer which was allocated by the 2160 * application. 2161 * 2162 * @pre None 2163 * 2164 * @post None 2165 * 2166 * @return OMX_ErrorNone = On Success 2167 * OMX_ErrorBadPortIndex = Bad port index from app 2168 */ 2169 /* ================================================================================ * */ 2170 static OMX_ERRORTYPE UseBuffer ( 2171 OMX_IN OMX_HANDLETYPE hComponent, 2172 OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr, 2173 OMX_IN OMX_U32 nPortIndex, 2174 OMX_IN OMX_PTR pAppPrivate, 2175 OMX_IN OMX_U32 nSizeBytes, 2176 OMX_IN OMX_U8* pBuffer) 2177 { 2178 OMX_PARAM_PORTDEFINITIONTYPE *pPortDef; 2179 AACDEC_COMPONENT_PRIVATE *pComponentPrivate; 2180 OMX_ERRORTYPE eError = OMX_ErrorNone; 2181 OMX_BUFFERHEADERTYPE *pBufferHeader; 2182 2183 2184 pComponentPrivate = (AACDEC_COMPONENT_PRIVATE *)(((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate); 2185 2186 #ifdef _ERROR_PROPAGATION__ 2187 if (pComponentPrivate->curState == OMX_StateInvalid){ 2188 eError = OMX_ErrorInvalidState; 2189 OMX_ERROR4(pComponentPrivate->dbg, "%d::OMX_ErrorInvalidState from UseBuffer\n",__LINE__); 2190 goto EXIT; 2191 } 2192 #endif 2193 #ifdef __PERF_INSTRUMENTATION__ 2194 PERF_ReceivedBuffer(pComponentPrivate->pPERF,pBuffer,nSizeBytes,PERF_ModuleHLMM); 2195 #endif 2196 2197 pPortDef = ((AACDEC_COMPONENT_PRIVATE*) 2198 pComponentPrivate)->pPortDef[nPortIndex]; 2199 OMX_PRCOMM2(pComponentPrivate->dbg, "%d :: pPortDef = %p\n", __LINE__,pPortDef); 2200 OMX_PRCOMM2(pComponentPrivate->dbg, "%d :: pPortDef->bEnabled = %d\n", __LINE__,pPortDef->bEnabled); 2201 2202 // 2203 AACDEC_OMX_CONF_CHECK_CMD(pPortDef, 1, 1); 2204 if (!pPortDef->bEnabled) { 2205 pComponentPrivate->AlloBuf_waitingsignal = 1; 2206 2207 pthread_mutex_lock(&pComponentPrivate->AlloBuf_mutex); 2208 pthread_cond_wait(&pComponentPrivate->AlloBuf_threshold, &pComponentPrivate->AlloBuf_mutex); 2209 pthread_mutex_unlock(&pComponentPrivate->AlloBuf_mutex); 2210 } 2211 // 2212 if(!pPortDef->bEnabled) { 2213 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorIncorrectStateOperation, 2214 "Port is Disabled: OMX_ErrorIncorrectStateOperation"); 2215 } 2216 2217 if(pPortDef->bPopulated) { 2218 AACDEC_OMX_ERROR_EXIT(eError,OMX_ErrorBadParameter, 2219 "Bad Size or Port Disabled : OMX_ErrorBadParameter"); 2220 } 2221 2222 OMX_MALLOC_GENERIC(pBufferHeader, OMX_BUFFERHEADERTYPE); 2223 2224 memset((pBufferHeader), 0x0, sizeof(OMX_BUFFERHEADERTYPE)); 2225 if (nPortIndex == OUTPUT_PORT_AACDEC) { 2226 pBufferHeader->nInputPortIndex = -1; 2227 pBufferHeader->nOutputPortIndex = nPortIndex; 2228 2229 pComponentPrivate->pOutputBufferList->pBufHdr[pComponentPrivate->pOutputBufferList->numBuffers] = pBufferHeader; 2230 pComponentPrivate->pOutputBufferList->bBufferPending[pComponentPrivate->pOutputBufferList->numBuffers] = 0; 2231 pComponentPrivate->pOutputBufferList->bufferOwner[pComponentPrivate->pOutputBufferList->numBuffers++] = 0; 2232 if (pComponentPrivate->pOutputBufferList->numBuffers == pPortDef->nBufferCountActual) { 2233 pPortDef->bPopulated = OMX_TRUE; 2234 } 2235 } 2236 else { 2237 pBufferHeader->nInputPortIndex = nPortIndex; 2238 pBufferHeader->nOutputPortIndex = -1; 2239 2240 pComponentPrivate->pInputBufferList->pBufHdr[pComponentPrivate->pInputBufferList->numBuffers] = pBufferHeader; 2241 pComponentPrivate->pInputBufferList->bBufferPending[pComponentPrivate->pInputBufferList->numBuffers] = 0; 2242 pComponentPrivate->pInputBufferList->bufferOwner[pComponentPrivate->pInputBufferList->numBuffers++] = 0; 2243 if (pComponentPrivate->pInputBufferList->numBuffers == pPortDef->nBufferCountActual) { 2244 pPortDef->bPopulated = OMX_TRUE; 2245 } 2246 } 2247 2248 if((pComponentPrivate->pPortDef[OUTPUT_PORT_AACDEC]->bPopulated == pComponentPrivate->pPortDef[OUTPUT_PORT_AACDEC]->bEnabled)&& 2249 (pComponentPrivate->pPortDef[INPUT_PORT_AACDEC]->bPopulated == pComponentPrivate->pPortDef[INPUT_PORT_AACDEC]->bEnabled) && 2250 (pComponentPrivate->InLoaded_readytoidle)) 2251 { 2252 pComponentPrivate->InLoaded_readytoidle = 0; 2253 #ifndef UNDER_CE 2254 pthread_mutex_lock(&pComponentPrivate->InLoaded_mutex); 2255 pthread_cond_signal(&pComponentPrivate->InLoaded_threshold); 2256 pthread_mutex_unlock(&pComponentPrivate->InLoaded_mutex); 2257 #else 2258 OMX_SignalEvent(&(pComponentPrivate->InLoaded_event)); 2259 #endif 2260 } 2261 2262 pBufferHeader->pAppPrivate = pAppPrivate; 2263 pBufferHeader->pPlatformPrivate = pComponentPrivate; 2264 pBufferHeader->nAllocLen = nSizeBytes; 2265 pBufferHeader->nVersion.s.nVersionMajor = AACDEC_MAJOR_VER; 2266 pBufferHeader->nVersion.s.nVersionMinor = AACDEC_MINOR_VER; 2267 2268 pComponentPrivate->nVersion = pBufferHeader->nVersion.nVersion; 2269 2270 pBufferHeader->pBuffer = pBuffer; 2271 pBufferHeader->nSize = sizeof(OMX_BUFFERHEADERTYPE); 2272 *ppBufferHdr = pBufferHeader; 2273 pComponentPrivate->bufAlloced = 1; 2274 OMX_PRBUFFER2(pComponentPrivate->dbg, "pBufferHeader = %p\n",pBufferHeader); 2275 2276 if (pComponentPrivate->bEnableCommandPending && pPortDef->bPopulated) { 2277 SendCommand (pComponentPrivate->pHandle, 2278 OMX_CommandPortEnable, 2279 pComponentPrivate->bEnableCommandParam,NULL); 2280 } 2281 EXIT: 2282 return eError; 2283 } 2284 2285 /* ================================================================================= */ 2286 /** 2287 * @fn GetExtensionIndex() description for GetExtensionIndex 2288 GetExtensionIndex(). 2289 Returns index for vendor specific settings. 2290 * 2291 * @see OMX_Core.h 2292 */ 2293 /* ================================================================================ */ 2294 static OMX_ERRORTYPE GetExtensionIndex( 2295 OMX_IN OMX_HANDLETYPE hComponent, 2296 OMX_IN OMX_STRING cParameterName, 2297 OMX_OUT OMX_INDEXTYPE* pIndexType) 2298 { 2299 OMX_ERRORTYPE eError = OMX_ErrorNone; 2300 2301 if (!(strcmp(cParameterName,"OMX.TI.index.config.aacdecHeaderInfo"))) { 2302 *pIndexType = OMX_IndexCustomAacDecHeaderInfoConfig; 2303 OMXDBG_PRINT(stderr, DSP, 2, 0, "OMX_IndexCustomAacDecHeaderInfoConfig\n"); 2304 } 2305 else if(!(strcmp(cParameterName,"OMX.TI.index.config.aacdecstreamIDinfo"))){ 2306 *pIndexType = OMX_IndexCustomAacDecStreamIDConfig; 2307 } 2308 else if(!(strcmp(cParameterName,"OMX.TI.index.config.aacdec.datapath"))) { 2309 *pIndexType = OMX_IndexCustomAacDecDataPath; 2310 } 2311 else if(!(strcmp(cParameterName,"OMX.TI.AAC.Decode.Debug"))) { 2312 *pIndexType = OMX_IndexCustomDebug; 2313 } 2314 else { 2315 eError = OMX_ErrorBadParameter; 2316 OMXDBG_PRINT(stderr, ERROR, 4, 0, "%d::OMX_ErrorBadParameter from GetExtensionIndex\n",__LINE__); 2317 } 2318 2319 return eError; 2320 } 2321 2322 /* ================================================================================= */ 2323 /** 2324 * @fn ComponentRoleEnum() description for ComponentRoleEnum() 2325 2326 Returns the role at the given index 2327 * 2328 * @see OMX_Core.h 2329 */ 2330 /* ================================================================================ */ 2331 static OMX_ERRORTYPE ComponentRoleEnum( 2332 OMX_IN OMX_HANDLETYPE hComponent, 2333 OMX_OUT OMX_U8 *cRole, 2334 OMX_IN OMX_U32 nIndex) 2335 { 2336 AACDEC_COMPONENT_PRIVATE *pComponentPrivate; 2337 2338 OMX_ERRORTYPE eError = OMX_ErrorNone; 2339 pComponentPrivate = (AACDEC_COMPONENT_PRIVATE *)(((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate); 2340 OMX_PRINT1(pComponentPrivate->dbg, "%d :: pComponentPrivate = 0x%p\n",__LINE__, pComponentPrivate); 2341 if(nIndex == 0){ 2342 if (cRole == NULL) { 2343 eError = OMX_ErrorBadParameter; 2344 } 2345 else { 2346 OMX_PRINT2(pComponentPrivate->dbg, "%d :: index=0\n",__LINE__); 2347 memcpy(cRole, &pComponentPrivate->componentRole->cRole, sizeof(OMX_U8) * OMX_MAX_STRINGNAME_SIZE); 2348 OMX_PRINT2(pComponentPrivate->dbg, "::::In ComponenetRoleEnum: cRole is set to %s\n",cRole); 2349 } 2350 } 2351 else { 2352 eError = OMX_ErrorNoMore; 2353 } 2354 return eError; 2355 } 2356 2357 #ifdef UNDER_CE 2358 /* ================================================================================= */ 2359 /** 2360 * @fns Sleep replace for WIN CE 2361 */ 2362 /* ================================================================================ */ 2363 int OMX_CreateEvent(OMX_Event *event){ 2364 int ret = OMX_ErrorNone; 2365 HANDLE createdEvent = NULL; 2366 if(event == NULL){ 2367 ret = OMX_ErrorBadParameter; 2368 OMXDBG_PRINT(stderr, ERROR, 4, 0, "%d::OMX_ErrorBadParameter from OMX_CreateEvent\n",__LINE__); 2369 goto EXIT; 2370 } 2371 event->event = CreateEvent(NULL, TRUE, FALSE, NULL); 2372 if(event->event == NULL) 2373 ret = (int)GetLastError(); 2374 EXIT: 2375 return ret; 2376 } 2377 2378 int OMX_SignalEvent(OMX_Event *event){ 2379 int ret = OMX_ErrorNone; 2380 if(event == NULL){ 2381 ret = OMX_ErrorBadParameter; 2382 OMXDBG_PRINT(stderr, ERROR, 4, 0, "%d::OMX_ErrorBadParameter from OMX_SignalEvent\n",__LINE__); 2383 goto EXIT; 2384 } 2385 SetEvent(event->event); 2386 ret = (int)GetLastError(); 2387 EXIT: 2388 return ret; 2389 } 2390 2391 int OMX_WaitForEvent(OMX_Event *event) { 2392 int ret = OMX_ErrorNone; 2393 if(event == NULL){ 2394 ret = OMX_ErrorBadParameter; 2395 OMXDBG_PRINT(stderr, ERROR, 4, 0, "%d::OMX_ErrorBadParameter from OMX_WaitForEvent\n",__LINE__); 2396 goto EXIT; 2397 } 2398 WaitForSingleObject(event->event, INFINITE); 2399 ret = (int)GetLastError(); 2400 EXIT: 2401 return ret; 2402 } 2403 2404 int OMX_DestroyEvent(OMX_Event *event) { 2405 int ret = OMX_ErrorNone; 2406 if(event == NULL){ 2407 ret = OMX_ErrorBadParameter; 2408 OMXDBG_PRINT(stderr, ERROR, 4, 0, "%d::OMX_ErrorBadParameter from OMX_DestroyEvent\n",__LINE__); 2409 goto EXIT; 2410 } 2411 CloseHandle(event->event); 2412 EXIT: 2413 return ret; 2414 } 2415 #endif 2416 2417