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_JpegDecoder.c 30 * 31 * This file implements OMX Component for JPEG decoder 32 * 33 * @patth $(CSLPATH)\jpeg_dec\src\OMX_JpegDecoder.c 34 * 35 * @rev 0.2 36 */ 37 38 /**************************************************************** 39 * INCLUDE FILES 40 *****************************************************************/ 41 42 /* -----------System and Platform Files ------------------------*/ 43 44 #ifdef UNDER_CE 45 #include <windows.h> 46 #include <oaf_osal.h> 47 #include <omx_core.h> 48 #else 49 #include <wchar.h> 50 #include <unistd.h> 51 #include <sys/time.h> 52 #include <sys/types.h> 53 #include <sys/ioctl.h> 54 #include <sys/select.h> 55 #include <errno.h> 56 #include <pthread.h> 57 #endif 58 59 #include <string.h> 60 #include <fcntl.h> 61 #include <stdlib.h> 62 #include <stdio.h> 63 #include <dbapi.h> 64 65 /* -----------------Program Header Files ---------------------------*/ 66 67 #include "OMX_JpegDec_Utils.h" 68 69 #ifdef RESOURCE_MANAGER_ENABLED 70 #include <ResourceManagerProxyAPI.h> 71 #endif 72 73 /*----------------------Global-----------------------------------*/ 74 OMX_STRING cJPEGdecName = "OMX.TI.JPEG.decoder"; 75 76 77 /* ---------------------------- Fucntion prototypes -----------------*/ 78 79 static OMX_ERRORTYPE SetCallbacks_JPEGDec(OMX_HANDLETYPE hComp, 80 OMX_CALLBACKTYPE* pCallBacks, 81 OMX_PTR pAppData); 82 static OMX_ERRORTYPE GetComponentVersion_JPEGDec(OMX_HANDLETYPE hComp, 83 OMX_STRING pComponentName, 84 OMX_VERSIONTYPE* pComponentVersion, 85 OMX_VERSIONTYPE* pSpecVersion, 86 OMX_UUIDTYPE* pComponentUUID); 87 static OMX_ERRORTYPE SendCommand_JPEGDec(OMX_HANDLETYPE hComponent, 88 OMX_COMMANDTYPE Cmd, 89 OMX_U32 nParam, 90 OMX_PTR pCmdData); 91 static OMX_ERRORTYPE GetParameter_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent, 92 OMX_IN OMX_INDEXTYPE nParamIndex, 93 OMX_INOUT OMX_PTR ComponentParameterStructure); 94 static OMX_ERRORTYPE SetParameter_JPEGDec(OMX_HANDLETYPE hComp, 95 OMX_INDEXTYPE nParamIndex, 96 OMX_PTR ComponentParameterStructure); 97 static OMX_ERRORTYPE GetConfig_JPEGDec(OMX_HANDLETYPE hComp, 98 OMX_INDEXTYPE nConfigIndex, 99 OMX_PTR ComponentConfigStructure); 100 static OMX_ERRORTYPE SetConfig_JPEGDec(OMX_HANDLETYPE hComp, 101 OMX_INDEXTYPE nConfigIndex, 102 OMX_PTR ComponentConfigStructure); 103 static OMX_ERRORTYPE EmptyThisBuffer(OMX_HANDLETYPE hComp, 104 OMX_BUFFERHEADERTYPE* pBuffer); 105 106 static OMX_ERRORTYPE FillThisBuffer_JPEGDec(OMX_HANDLETYPE hComp, 107 OMX_BUFFERHEADERTYPE* pBuffer); 108 109 static OMX_ERRORTYPE GetState(OMX_HANDLETYPE hComp, 110 OMX_STATETYPE* pState); 111 static OMX_ERRORTYPE ComponentTunnelRequest_JPEGDec(OMX_IN OMX_HANDLETYPE hComp, 112 OMX_IN OMX_U32 nPort, 113 OMX_IN OMX_HANDLETYPE hTunneledComp, 114 OMX_IN OMX_U32 nTunneledPort, 115 OMX_INOUT OMX_TUNNELSETUPTYPE* pTunnelSetup); 116 static OMX_ERRORTYPE UseBuffer_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent, 117 OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr, 118 OMX_IN OMX_U32 nPortIndex, 119 OMX_IN OMX_PTR pAppPrivate, 120 OMX_IN OMX_U32 nSizeBytes, 121 OMX_IN OMX_U8* pBuffer) ; 122 static OMX_ERRORTYPE FreeBuffer_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent, 123 OMX_IN OMX_U32 nPortIndex, 124 OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); 125 static OMX_ERRORTYPE Allocate_DSPResources_JPEGDec(OMX_IN JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate, 126 OMX_IN OMX_U32 nPortIndex); 127 static OMX_ERRORTYPE VerifyTunnelConnection_JPEGDec(JPEGDEC_PORT_TYPE *pPort, 128 OMX_HANDLETYPE hTunneledComp, 129 OMX_PARAM_PORTDEFINITIONTYPE* pPortDef); 130 static OMX_ERRORTYPE AllocateBuffer_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent, 131 OMX_INOUT OMX_BUFFERHEADERTYPE** pBuffer, 132 OMX_IN OMX_U32 nPortIndex, 133 OMX_IN OMX_PTR pAppPrivate, 134 OMX_IN OMX_U32 nSizeBytes); 135 static void JPEGDEC_InitBufferFlagTrack(JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate, 136 OMX_U32 nPortIndex); 137 #ifdef KHRONOS_1_1 138 static OMX_ERRORTYPE ComponentRoleEnum(OMX_IN OMX_HANDLETYPE hComponent, 139 OMX_OUT OMX_U8 *cRole, 140 OMX_IN OMX_U32 nIndex); 141 #endif 142 143 static OMX_ERRORTYPE GetExtensionIndex_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent, 144 OMX_IN OMX_STRING cParameterName, 145 OMX_OUT OMX_INDEXTYPE* pIndexType); 146 147 /* -------------------------- Function Implementation ------------------ */ 148 149 150 /* ========================================================================== */ 151 /** 152 * @fn AllocateBuffer_JPEGDec - Implements allocatebuffer functionality 153 * @param hComponent - Component handle. 154 * @param pBuffHead - pointer to buffer header structure 155 * @param nPortIndex - Port index 156 * @param pAppPrivate - pointer to application private data 157 * @param nSizeBytes - size of the buffer to allocate 158 * @return: OMX_ERRORTYPE 159 * OMX_ErrorNone on success 160 * !OMX_ErrorNone on any failure 161 */ 162 /* ========================================================================== */ 163 static OMX_ERRORTYPE AllocateBuffer_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent, 164 OMX_INOUT OMX_BUFFERHEADERTYPE** pBuffHead, 165 OMX_IN OMX_U32 nPortIndex, 166 OMX_IN OMX_PTR pAppPrivate, 167 OMX_IN OMX_U32 nSizeBytes) 168 { 169 /*VALIDATE INPUT ARGUMENTS*/ 170 OMX_COMPONENTTYPE *pHandle = NULL; 171 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 172 OMX_PARAM_PORTDEFINITIONTYPE* pPortDef = NULL; 173 JPEGDEC_PORT_TYPE* pCompPort; 174 OMX_U8 nBufferCount = -1; 175 OMX_ERRORTYPE eError = OMX_ErrorNone; 176 177 OMX_CHECK_PARAM(hComponent); 178 pHandle = (OMX_COMPONENTTYPE *)hComponent; 179 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 180 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1); 181 182 pPortDef = pComponentPrivate->pCompPort[nPortIndex]->pPortDef; 183 nBufferCount = pComponentPrivate->pCompPort[nPortIndex]->nBuffCount; 184 pCompPort = pComponentPrivate->pCompPort[nPortIndex]; 185 186 OMX_PRINT1(pComponentPrivate->dbg, "Entering function AllocateBuffer_JPEGDec\n"); 187 188 OMX_PRBUFFER1(pComponentPrivate->dbg, "In AllocateBuffer_JPEGDec %d %lu %lu\n", 189 nBufferCount, pPortDef->nBufferCountActual, nPortIndex); 190 191 if (nBufferCount >= pPortDef->nBufferCountActual) { 192 eError = OMX_ErrorInsufficientResources; 193 OMX_PRBUFFER4(pComponentPrivate->dbg, " try to allocate more buffers that the port supports\n"); 194 goto EXIT; 195 } 196 197 if (nPortIndex == JPEGDEC_INPUT_PORT) { 198 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr, sizeof(OMX_BUFFERHEADERTYPE)); 199 OMX_CONF_INIT_STRUCT(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr, OMX_BUFFERHEADERTYPE); 200 OMX_PRBUFFER1(pComponentPrivate->dbg, "pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr = %p\n", pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr); 201 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->nOutputPortIndex = OMX_NOPORT; 202 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->nInputPortIndex = pPortDef->nPortIndex; 203 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 204 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->nVersion = pPortDef->nVersion; 205 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->pAppPrivate = pAppPrivate; 206 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->nAllocLen = nSizeBytes; 207 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->bAllocbyComponent = OMX_TRUE; 208 209 *pBuffHead = pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr; 210 211 } 212 else if (nPortIndex == JPEGDEC_OUTPUT_PORT) { 213 214 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr, sizeof(OMX_BUFFERHEADERTYPE)); 215 OMX_CONF_INIT_STRUCT(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr, OMX_BUFFERHEADERTYPE); 216 OMX_PRBUFFER1(pComponentPrivate->dbg, "pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBuffCount]->pBufferHdr = %p\n", pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr); 217 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->nOutputPortIndex = pPortDef->nPortIndex; 218 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->nInputPortIndex = OMX_NOPORT; 219 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 220 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->nVersion = pPortDef->nVersion; 221 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->pAppPrivate = pAppPrivate; 222 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->nAllocLen = nSizeBytes; 223 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->bAllocbyComponent = OMX_TRUE; 224 225 *pBuffHead = pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr; 226 227 } 228 else { 229 eError = OMX_ErrorBadPortIndex; 230 goto EXIT; 231 } 232 233 if (nPortIndex == JPEGDEC_INPUT_PORT) { 234 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->pBuffer, nSizeBytes + 256); 235 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->pBuffer = (pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->pBuffer) + 128; 236 237 #ifdef __PERF_INSTRUMENTATION__ 238 PERF_ReceivedFrame(pComponentPrivate->pPERF, 239 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->pBuffer, 240 nSizeBytes, 241 PERF_ModuleMemory); 242 #endif 243 244 } 245 else if (nPortIndex == JPEGDEC_OUTPUT_PORT) { 246 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->pBuffer, nSizeBytes + 256); 247 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->pBuffer = pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->pBuffer + 128; 248 249 #ifdef __PERF_INSTRUMENTATION__ 250 PERF_ReceivedFrame(pComponentPrivate->pPERF, 251 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr->pBuffer, 252 nSizeBytes, 253 PERF_ModuleMemory); 254 #endif 255 256 } 257 else { 258 eError = OMX_ErrorBadPortIndex; 259 goto EXIT; 260 } 261 262 eError = Allocate_DSPResources_JPEGDec(pComponentPrivate, nPortIndex); 263 if (eError != OMX_ErrorNone) { 264 OMX_PRDSP4(pComponentPrivate->dbg, "OMX_ErrorInsufficientResources\n"); 265 eError = OMX_ErrorInsufficientResources; 266 goto EXIT; 267 } 268 269 if (nPortIndex == JPEGDEC_INPUT_PORT) { 270 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->pBufferHdr->pInputPortPrivate = 271 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]; 272 } 273 else { 274 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->pBufferHdr->pOutputPortPrivate = 275 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]; 276 } 277 278 if (pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->hTunnelComponent != NULL) { 279 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->eBufferOwner = JPEGDEC_BUFFER_TUNNEL_COMPONENT; 280 } 281 else { 282 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->eBufferOwner = JPEGDEC_BUFFER_CLIENT; 283 } 284 285 pComponentPrivate->pCompPort[nPortIndex]->nBuffCount++; 286 if (pComponentPrivate->pCompPort[nPortIndex]->nBuffCount == pPortDef->nBufferCountActual) { 287 pPortDef->bPopulated = OMX_TRUE; 288 JPEGDEC_InitBufferFlagTrack(pComponentPrivate, nPortIndex); 289 pthread_mutex_lock(&(pComponentPrivate->mJpegDecMutex)); 290 pthread_cond_signal(&(pComponentPrivate->sPortPopulated_cond)); 291 pthread_mutex_unlock(&(pComponentPrivate->mJpegDecMutex)); 292 OMX_PRINT2(pComponentPrivate->dbg, " Port [%lu] Populated!\n", nPortIndex); 293 } 294 295 EXIT: 296 return eError; 297 } /* End of AllocateBuffer_JPEGDec */ 298 299 300 /* ========================================================================== */ 301 /** 302 * @fn FreeBuffer_JPEGDec - Implements freebuffer functionality 303 * @param hComponent - Component handle. 304 * @param nPortIndex - Port index 305 * @param pBuffHead - pointer to buffer header structure 306 * @return: OMX_ERRORTYPE 307 * OMX_ErrorNone on success 308 * !OMX_ErrorNone on any failure 309 */ 310 /* ========================================================================== */ 311 static OMX_ERRORTYPE FreeBuffer_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent, 312 OMX_IN OMX_U32 nPortIndex, 313 OMX_IN OMX_BUFFERHEADERTYPE* pBuffHead) 314 { 315 OMX_ERRORTYPE eError = OMX_ErrorNone; 316 OMX_COMPONENTTYPE *pHandle = NULL; 317 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 318 OMX_PARAM_PORTDEFINITIONTYPE* pPortDef = NULL; 319 JPEGDEC_BUFFER_PRIVATE* pBuffPrivate = NULL; 320 OMX_U8* pTemp; 321 OMX_U8 nBufferCount = -1; 322 323 OMX_CHECK_PARAM(hComponent); 324 OMX_CHECK_PARAM(pBuffHead); 325 326 pHandle = (OMX_COMPONENTTYPE *)hComponent; 327 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 328 329 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1); 330 331 if (nPortIndex != 1 && nPortIndex != 0) { 332 eError = OMX_ErrorBadPortIndex; 333 goto PRINT_EXIT; 334 } 335 336 OMX_PRBUFFER2(pComponentPrivate->dbg, "JPEG-D: Entering funtion FreeBuffer_JPEGDec %lu %p\n", nPortIndex, pBuffHead); 337 338 if(pComponentPrivate->nCurState == OMX_StateLoaded){ 339 eError = OMX_ErrorIncorrectStateOperation; 340 goto PRINT_EXIT; 341 } 342 pPortDef = pComponentPrivate->pCompPort[nPortIndex]->pPortDef; 343 nBufferCount = pComponentPrivate->pCompPort[nPortIndex]->nBuffCount; 344 OMX_PRBUFFER1(pComponentPrivate->dbg, "Trying to Free Header %p\nBuffer %p\n", pBuffHead, pBuffHead->pBuffer); 345 346 if (nPortIndex == JPEGDEC_INPUT_PORT) { 347 348 pBuffPrivate = pBuffHead->pInputPortPrivate; 349 if (pBuffPrivate->pUALGParams) { 350 pTemp = (OMX_U8*)(pBuffPrivate->pUALGParams); 351 pTemp -= 128; 352 (pBuffPrivate->pUALGParams) = (JPEGDEC_UAlgInBufParamStruct *)pTemp; 353 OMX_FREE(pBuffPrivate->pUALGParams); 354 pBuffPrivate->pUALGParams = NULL; 355 } 356 } 357 else if (nPortIndex == JPEGDEC_OUTPUT_PORT) { 358 359 pBuffPrivate = pBuffHead->pOutputPortPrivate; 360 if (pBuffPrivate->pUALGParams) { 361 pTemp = (OMX_U8*)(pBuffPrivate->pUALGParams); 362 pTemp -= 128; 363 (pBuffPrivate->pUALGParams) = (JPEGDEC_UAlgOutBufParamStruct *)pTemp; 364 OMX_FREE(pBuffPrivate->pUALGParams); 365 pBuffPrivate->pUALGParams = NULL; 366 } 367 } 368 else { 369 eError = OMX_ErrorBadPortIndex; 370 goto PRINT_EXIT; 371 } 372 373 if (pBuffPrivate->bAllocbyComponent == OMX_TRUE) { 374 if (pBuffHead->pBuffer) { 375 376 #ifdef __PERF_INSTRUMENTATION__ 377 PERF_SendingFrame(pComponentPrivate->pPERF, 378 pBuffHead->pBuffer, 379 pBuffHead->nFilledLen, 380 PERF_ModuleMemory); 381 #endif 382 383 OMX_PRBUFFER1(pComponentPrivate->dbg, "INTERNAL BUFFER USED , trying to free it.\n"); 384 pBuffHead->pBuffer -= 128; 385 OMX_FREE(pBuffHead->pBuffer); 386 pBuffHead->pBuffer = NULL; 387 } 388 } 389 390 if (pBuffHead) { 391 OMX_FREE(pBuffHead); 392 pBuffHead = NULL; 393 } 394 395 396 OMX_PRSTATE2(pComponentPrivate->dbg, "Current state is %d and To State is %d\n", pComponentPrivate->nCurState, pComponentPrivate->nToState); 397 if ( pPortDef->bEnabled && 398 ((pComponentPrivate->nCurState == OMX_StateIdle && pComponentPrivate->nToState != OMX_StateLoaded) || 399 (pComponentPrivate->nCurState == OMX_StateExecuting || 400 pComponentPrivate->nCurState == OMX_StatePause)) ) { 401 402 pComponentPrivate->cbInfo.EventHandler (pComponentPrivate->pHandle, 403 pComponentPrivate->pHandle->pApplicationPrivate, 404 OMX_EventError, 405 OMX_ErrorPortUnpopulated, 406 OMX_TI_ErrorMinor, 407 "Port Unpopulated"); 408 } 409 410 nBufferCount = --pComponentPrivate->pCompPort[nPortIndex]->nBuffCount; 411 412 OMX_PRBUFFER1(pComponentPrivate->dbg, "nBufferCount %d\n", nBufferCount); 413 if (nBufferCount == 0) { 414 pComponentPrivate->pCompPort[nPortIndex]->pPortDef->bPopulated = OMX_FALSE; 415 OMX_PRBUFFER2(pComponentPrivate->dbg, "port %lu is %u\n", nPortIndex, pComponentPrivate->pCompPort[nPortIndex]->pPortDef->bPopulated); 416 pthread_mutex_lock(&(pComponentPrivate->mJpegDecMutex)); 417 pthread_cond_signal(&(pComponentPrivate->sPortPopulated_cond)); 418 pthread_mutex_unlock(&(pComponentPrivate->mJpegDecMutex)); 419 } 420 421 if ((!pPortDef->bEnabled) && 422 (!pComponentPrivate->pCompPort[nPortIndex]->pPortDef->bPopulated)) { 423 if ((nPortIndex == 0) && (!pComponentPrivate->bInportDisableComplete)) { 424 pComponentPrivate->bInportDisableComplete = OMX_TRUE; 425 pComponentPrivate->cbInfo.EventHandler (pComponentPrivate->pHandle, 426 pComponentPrivate->pHandle->pApplicationPrivate, 427 OMX_EventCmdComplete, 428 OMX_CommandPortDisable, 429 0, 430 NULL); 431 } 432 if ((nPortIndex == 1) && (!pComponentPrivate->bOutportDisableComplete)) { 433 pComponentPrivate->bOutportDisableComplete = OMX_TRUE; 434 pComponentPrivate->cbInfo.EventHandler (pComponentPrivate->pHandle, 435 pComponentPrivate->pHandle->pApplicationPrivate, 436 OMX_EventCmdComplete, 437 OMX_CommandPortDisable, 438 1, 439 NULL); 440 } 441 } 442 PRINT_EXIT: 443 OMX_PRINT1(pComponentPrivate->dbg, "Exit from FreeBuffer function error = %x\n", eError); 444 EXIT: 445 return eError; 446 } /* End of FreeBuffer_JPEGDec */ 447 448 449 /* ========================================================================== */ 450 /** 451 * @fn UseBuffer_JPEGDec - Implements usebuffer functionality 452 * @param hComponent - Component handle. 453 * @param pBuffHead - pointer to buffer header structure 454 * @param nPortIndex - Port index 455 * @param pAppPrivate - pointer to application private data 456 * @param nSizeBytes - size of the buffer 457 * @param pBuffer - pointer to the buffer 458 * @return: OMX_ERRORTYPE 459 * OMX_ErrorNone on success 460 * !OMX_ErrorNone on any failure 461 */ 462 /* ========================================================================== */ 463 static OMX_ERRORTYPE UseBuffer_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent, 464 OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr, 465 OMX_IN OMX_U32 nPortIndex, 466 OMX_IN OMX_PTR pAppPrivate, 467 OMX_IN OMX_U32 nSizeBytes, 468 OMX_IN OMX_U8* pBuffer) 469 { 470 OMX_COMPONENTTYPE *pHandle = NULL; 471 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 472 OMX_PARAM_PORTDEFINITIONTYPE* pPortDef = NULL; 473 OMX_ERRORTYPE eError = OMX_ErrorNone; 474 OMX_HANDLETYPE hTunnelComponent; 475 OMX_U8 nBufferCount = -1; 476 477 pHandle = (OMX_COMPONENTTYPE *)hComponent; 478 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 479 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1); 480 481 pPortDef = pComponentPrivate->pCompPort[nPortIndex]->pPortDef; 482 nBufferCount = pComponentPrivate->pCompPort[nPortIndex]->nBuffCount; 483 hTunnelComponent = pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->hTunnelComponent; 484 485 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion UseBuffer_JPEGDec\n"); 486 487 #ifdef __PERF_INSTRUMENTATION__ 488 PERF_ReceivedFrame(pComponentPrivate->pPERF, 489 pBuffer, 490 nSizeBytes, 491 PERF_ModuleHLMM); 492 #endif 493 494 495 if (nPortIndex == JPEGDEC_INPUT_PORT) { 496 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr, sizeof(OMX_BUFFERHEADERTYPE)); 497 *ppBufferHdr = pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr; 498 } 499 else if (nPortIndex == JPEGDEC_OUTPUT_PORT) { 500 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr, sizeof(OMX_BUFFERHEADERTYPE)); 501 *ppBufferHdr = pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pBufferHdr; 502 } 503 else { 504 eError = OMX_ErrorBadPortIndex; 505 goto EXIT; 506 } 507 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->bAllocbyComponent = OMX_FALSE; 508 509 /* set relevant fields */ 510 (*ppBufferHdr)->nSize = sizeof(OMX_BUFFERHEADERTYPE); 511 (*ppBufferHdr)->nVersion = pPortDef->nVersion; 512 (*ppBufferHdr)->pBuffer = pBuffer; 513 (*ppBufferHdr)->nAllocLen = nSizeBytes; 514 (*ppBufferHdr)->pAppPrivate = pAppPrivate; 515 516 if (hTunnelComponent != NULL) { 517 /* set direction dependent fields */ 518 if (pPortDef->eDir == OMX_DirInput) { 519 (*ppBufferHdr)->nInputPortIndex = nPortIndex; 520 (*ppBufferHdr)->nOutputPortIndex = pComponentPrivate->pCompPort[nPortIndex]->nTunnelPort; 521 522 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->pBufferHdr = (*ppBufferHdr); 523 } 524 else { 525 (*ppBufferHdr)->nOutputPortIndex = nPortIndex; 526 (*ppBufferHdr)->nInputPortIndex = pComponentPrivate->pCompPort[nPortIndex]->nTunnelPort; 527 528 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->pBufferHdr = (*ppBufferHdr); 529 } 530 } 531 else { 532 if (nPortIndex == JPEGDEC_INPUT_PORT) { 533 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->pBufferHdr->nInputPortIndex = JPEGDEC_INPUT_PORT; 534 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->pBufferHdr->nOutputPortIndex = OMX_NOPORT; 535 } 536 else { 537 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->pBufferHdr->nInputPortIndex = OMX_NOPORT; 538 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->pBufferHdr->nOutputPortIndex = JPEGDEC_OUTPUT_PORT; 539 } 540 } 541 if (nPortIndex == JPEGDEC_INPUT_PORT) { 542 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->pBufferHdr->pInputPortPrivate = 543 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]; 544 } 545 else { 546 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]->pBufferHdr->pOutputPortPrivate = 547 pComponentPrivate->pCompPort[nPortIndex]->pBufferPrivate[nBufferCount]; 548 } 549 550 eError = Allocate_DSPResources_JPEGDec(pComponentPrivate, nPortIndex); 551 if (eError != OMX_ErrorNone) { 552 OMX_PRDSP4(pComponentPrivate->dbg, "Error: Allocate_DSPResources_JPEGDec failed\n"); 553 eError = OMX_ErrorInsufficientResources; 554 goto EXIT; 555 } 556 /* increment buffer count */ 557 558 pComponentPrivate->pCompPort[nPortIndex]->nBuffCount++; 559 if (pComponentPrivate->pCompPort[nPortIndex]->nBuffCount == pPortDef->nBufferCountActual) { 560 pPortDef->bPopulated = OMX_TRUE; 561 JPEGDEC_InitBufferFlagTrack(pComponentPrivate, nPortIndex); 562 pthread_mutex_lock(&(pComponentPrivate->mJpegDecMutex)); 563 pthread_cond_signal(&(pComponentPrivate->sPortPopulated_cond)); 564 pthread_mutex_unlock(&(pComponentPrivate->mJpegDecMutex)); 565 } 566 EXIT: 567 return eError; 568 } /* end of UseBuffer_JPEGDec */ 569 570 571 572 /* ========================================================================== */ 573 /** 574 * @fn OMX_ComponentInit - Updates the component function pointer to the handle. 575 * Sets default parameters. 576 * @param hComponent - Component handle. 577 * @return: OMX_ERRORTYPE 578 * OMX_ErrorNone on success 579 * !OMX_ErrorNone on any failure 580 */ 581 /* ========================================================================== */ 582 OMX_ERRORTYPE OMX_ComponentInit(OMX_HANDLETYPE hComponent) 583 { 584 585 OMX_COMPONENTTYPE *pHandle = NULL; 586 OMX_ERRORTYPE eError = OMX_ErrorNone; 587 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 588 OMX_U8 i = 0; 589 OMX_CHECK_PARAM(hComponent); 590 pHandle = (OMX_COMPONENTTYPE *)hComponent; 591 592 LinkedList_Create(&AllocList); 593 594 OMX_MALLOC(pHandle->pComponentPrivate, sizeof(JPEGDEC_COMPONENT_PRIVATE)); 595 596 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 597 598 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1); 599 600 OMX_DBG_INIT(pComponentPrivate->dbg, "OMX_DBG_JPEGDEC"); 601 602 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion OMX_ComponentInit\n"); 603 604 #ifdef __PERF_INSTRUMENTATION__ 605 pComponentPrivate->pPERF = PERF_Create(PERF_FOURS("JPD "), PERF_ModuleLLMM | PERF_ModuleImageDecode); 606 pComponentPrivate->pPERFcomp = NULL; 607 #endif 608 609 ((JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate)->pHandle = pHandle; 610 pComponentPrivate->nCurState = OMX_StateLoaded; 611 pComponentPrivate->ComponentVersion.s.nVersionMajor = 0x01; 612 pComponentPrivate->ComponentVersion.s.nVersionMinor = 0x00; 613 pComponentPrivate->ComponentVersion.s.nRevision = 0x00; 614 pComponentPrivate->ComponentVersion.s.nStep = 0x00; 615 OMX_MALLOC(pComponentPrivate->cComponentName, COMP_MAX_NAMESIZE + 1); 616 strncpy(pComponentPrivate->cComponentName, cJPEGdecName, COMP_MAX_NAMESIZE); 617 618 pHandle->SetCallbacks = SetCallbacks_JPEGDec; 619 pHandle->GetComponentVersion = GetComponentVersion_JPEGDec; 620 pHandle->SendCommand = SendCommand_JPEGDec; 621 pHandle->GetParameter = GetParameter_JPEGDec; 622 pHandle->SetParameter = SetParameter_JPEGDec; 623 pHandle->GetConfig = GetConfig_JPEGDec; 624 pHandle->SetConfig = SetConfig_JPEGDec; 625 pHandle->GetState = GetState; 626 pHandle->EmptyThisBuffer = EmptyThisBuffer; 627 pHandle->FillThisBuffer = FillThisBuffer_JPEGDec; 628 pHandle->ComponentTunnelRequest = ComponentTunnelRequest_JPEGDec; 629 pHandle->ComponentDeInit = ComponentDeInit; 630 pHandle->UseBuffer = UseBuffer_JPEGDec; 631 pHandle->FreeBuffer = FreeBuffer_JPEGDec; 632 pHandle->AllocateBuffer = AllocateBuffer_JPEGDec; 633 pHandle->GetExtensionIndex = GetExtensionIndex_JPEGDec; 634 #ifdef KHRONOS_1_1 635 pHandle->ComponentRoleEnum = ComponentRoleEnum; 636 #endif 637 638 /* Allocate memory for component data structures */ 639 OMX_MALLOC(pComponentPrivate->pPortParamType, sizeof(OMX_PORT_PARAM_TYPE)); 640 OMX_MALLOC(pComponentPrivate->pPriorityMgmt, sizeof(OMX_PRIORITYMGMTTYPE)); 641 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT], sizeof(JPEGDEC_PORT_TYPE)); 642 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT], sizeof(JPEGDEC_PORT_TYPE)); 643 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pParamBufSupplier, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE)); 644 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pParamBufSupplier, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE)); 645 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef, sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); 646 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef, sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); 647 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat, sizeof(OMX_IMAGE_PARAM_PORTFORMATTYPE)); 648 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat, sizeof(OMX_IMAGE_PARAM_PORTFORMATTYPE)); 649 OMX_MALLOC(pComponentPrivate->pScalePrivate, sizeof(OMX_CONFIG_SCALEFACTORTYPE)); /* Scale Factor */ 650 OMX_MALLOC(pComponentPrivate->pSectionDecode, sizeof(OMX_CUSTOM_IMAGE_DECODE_SECTION)); 651 OMX_MALLOC(pComponentPrivate->pSubRegionDecode, sizeof(OMX_CUSTOM_IMAGE_DECODE_SUBREGION)); 652 653 #ifdef KHRONOS_1_1 654 OMX_MALLOC(pComponentPrivate->pAudioPortType, sizeof(OMX_PORT_PARAM_TYPE)); 655 OMX_CONF_INIT_STRUCT(pComponentPrivate->pAudioPortType, OMX_PORT_PARAM_TYPE); 656 OMX_MALLOC(pComponentPrivate->pVideoPortType, sizeof(OMX_PORT_PARAM_TYPE)); 657 OMX_CONF_INIT_STRUCT(pComponentPrivate->pVideoPortType, OMX_PORT_PARAM_TYPE); 658 OMX_MALLOC(pComponentPrivate->pOtherPortType, sizeof(OMX_PORT_PARAM_TYPE)); 659 OMX_CONF_INIT_STRUCT(pComponentPrivate->pOtherPortType, OMX_PORT_PARAM_TYPE); 660 OMX_MALLOC(pComponentPrivate->pCompRole, sizeof(OMX_PARAM_COMPONENTROLETYPE)); 661 OMX_CONF_INIT_STRUCT(pComponentPrivate->pCompRole,OMX_PARAM_COMPONENTROLETYPE); 662 OMX_MALLOC(pComponentPrivate->pQuantTable, sizeof(OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE)); 663 OMX_CONF_INIT_STRUCT(pComponentPrivate->pQuantTable,OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE); 664 pComponentPrivate->pQuantTable->eQuantizationTable = OMX_IMAGE_QuantizationTableLuma; 665 OMX_MALLOC(pComponentPrivate->pHuffmanTable, sizeof(OMX_IMAGE_PARAM_HUFFMANTTABLETYPE)); 666 OMX_CONF_INIT_STRUCT(pComponentPrivate->pHuffmanTable,OMX_IMAGE_PARAM_HUFFMANTTABLETYPE); 667 pComponentPrivate->pHuffmanTable->eHuffmanTable = OMX_IMAGE_HuffmanTableAC; 668 669 pComponentPrivate->pAudioPortType->nPorts = 0; 670 pComponentPrivate->pAudioPortType->nStartPortNumber = -1; 671 pComponentPrivate->pVideoPortType->nPorts = 0; 672 pComponentPrivate->pVideoPortType->nStartPortNumber = -1; 673 pComponentPrivate->pOtherPortType->nPorts = 0; 674 pComponentPrivate->pOtherPortType->nStartPortNumber = -1; 675 676 #endif 677 for (i = 0;i<NUM_OF_BUFFERS;i++) { 678 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[i], sizeof(JPEGDEC_BUFFER_PRIVATE)); 679 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[i]->pBufferHdr = NULL; 680 } 681 682 for (i = 0;i<NUM_OF_BUFFERS;i++) { 683 OMX_MALLOC(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[i], sizeof(JPEGDEC_BUFFER_PRIVATE)); 684 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[i]->pBufferHdr = NULL; 685 } 686 687 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->hTunnelComponent = NULL; 688 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->hTunnelComponent = NULL; 689 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->nBuffCount = 0; 690 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->nBuffCount = 0; 691 pComponentPrivate->nProgressive = 0; 692 pComponentPrivate->nInputFrameWidth = 1600; 693 pComponentPrivate->nOutputColorFormat = OMX_COLOR_Format32bitARGB8888; 694 pComponentPrivate->nProfileID = 0; 695 pComponentPrivate->nIsLCMLActive = 0; 696 pComponentPrivate->pDllHandle = NULL; 697 pComponentPrivate->pLCML = NULL; 698 pComponentPrivate->pMarkData = NULL; 699 pComponentPrivate->pMarkBuf = NULL; 700 pComponentPrivate->hMarkTargetComponent = NULL; 701 pComponentPrivate->pHandle->pApplicationPrivate = (OMX_PTR *)200; 702 pComponentPrivate->nInPortIn = 0; 703 pComponentPrivate->nOutPortOut = 0; 704 pComponentPrivate->bPreempted = OMX_FALSE; 705 706 /*Slide decoding defaults*/ 707 OMX_CONF_INIT_STRUCT(pComponentPrivate->pSectionDecode, OMX_CUSTOM_IMAGE_DECODE_SECTION); 708 pComponentPrivate->pSectionDecode->nMCURow = 0; 709 pComponentPrivate->pSectionDecode->nAU = 0; 710 pComponentPrivate->pSectionDecode->bSectionsInput = 0; 711 pComponentPrivate->pSectionDecode->bSectionsOutput = 0; 712 713 OMX_CONF_INIT_STRUCT(pComponentPrivate->pSubRegionDecode, OMX_CUSTOM_IMAGE_DECODE_SUBREGION); 714 pComponentPrivate->pSubRegionDecode->nXOrg = 0; 715 pComponentPrivate->pSubRegionDecode->nYOrg = 0; 716 pComponentPrivate->pSubRegionDecode->nXLength = 0; 717 pComponentPrivate->pSubRegionDecode->nYLength = 0; 718 719 720 /* Set pPortParamType defaults */ 721 OMX_CONF_INIT_STRUCT(pComponentPrivate->pPortParamType, OMX_PORT_PARAM_TYPE); 722 pComponentPrivate->pPortParamType->nPorts = NUM_OF_PORTS; 723 pComponentPrivate->pPortParamType->nStartPortNumber = 0x0; 724 725 /* Set pInPortDef defaults */ 726 OMX_CONF_INIT_STRUCT(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef, OMX_PARAM_PORTDEFINITIONTYPE); 727 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->nPortIndex = JPEGDEC_INPUT_PORT; 728 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->eDir = OMX_DirInput; 729 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->nBufferCountActual = NUM_OF_BUFFERS; 730 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->nBufferCountMin = 1; 731 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->nBufferSize = 70532; 732 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->bEnabled = OMX_TRUE; 733 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->bPopulated = OMX_FALSE; 734 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->eDomain = OMX_PortDomainImage; 735 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->format.image.cMIMEType = "JPEGDEC"; 736 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->format.image.pNativeRender = NULL; 737 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->format.image.nFrameWidth = 640 ; /* 128*/ 738 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->format.image.nFrameHeight = 480; /*96 */ 739 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->format.image.nStride = -1; 740 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->format.image.nSliceHeight = -1; 741 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->format.image.bFlagErrorConcealment = OMX_FALSE; 742 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->format.image.eCompressionFormat = OMX_IMAGE_CodingJPEG; 743 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->format.image.eColorFormat = OMX_COLOR_FormatUnused; 744 745 /* Set pOutPortDef defaults */ 746 OMX_CONF_INIT_STRUCT(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef, OMX_PARAM_PORTDEFINITIONTYPE); 747 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->nPortIndex = JPEGDEC_OUTPUT_PORT; 748 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->eDir = OMX_DirOutput; 749 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->nBufferCountMin = 1; 750 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->nBufferCountActual = NUM_OF_BUFFERS; 751 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->nBufferSize = (640*480*2); 752 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->bEnabled = OMX_TRUE; 753 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->bPopulated = OMX_FALSE; 754 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->eDomain = OMX_PortDomainImage; 755 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->format.image.cMIMEType = "JPEGDEC"; 756 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->format.image.pNativeRender = NULL; 757 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->format.image.nFrameWidth = 640; 758 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->format.image.nFrameHeight = 480; 759 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->format.image.nStride = -1; 760 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->format.image.nSliceHeight = -1; 761 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->format.image.bFlagErrorConcealment = OMX_FALSE; 762 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->format.image.eCompressionFormat = OMX_IMAGE_CodingUnused; 763 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->format.image.eColorFormat = OMX_COLOR_FormatYUV420PackedPlanar; 764 /* added for vpp tunneling */ 765 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->format.video.eColorFormat = OMX_COLOR_FormatYCbYCr; 766 767 768 /* Set pInPortFormat defaults */ 769 OMX_CONF_INIT_STRUCT(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat, OMX_IMAGE_PARAM_PORTFORMATTYPE); 770 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat->nPortIndex = JPEGDEC_INPUT_PORT; 771 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat->nIndex = 0x0; 772 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat->eCompressionFormat =OMX_IMAGE_CodingJPEG; 773 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat->eColorFormat = OMX_COLOR_FormatUnused; 774 775 /* Set pOutPortFormat defaults */ 776 OMX_CONF_INIT_STRUCT(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat, OMX_IMAGE_PARAM_PORTFORMATTYPE); 777 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat->nPortIndex = JPEGDEC_OUTPUT_PORT; 778 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat->nIndex = 0x0; 779 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat->eCompressionFormat = OMX_IMAGE_CodingUnused; 780 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat->eColorFormat = OMX_COLOR_FormatYUV420PackedPlanar; 781 782 /* Set pPriorityMgmt defaults */ 783 OMX_CONF_INIT_STRUCT(pComponentPrivate->pPriorityMgmt, OMX_PRIORITYMGMTTYPE); 784 pComponentPrivate->pPriorityMgmt->nGroupPriority = -1; 785 pComponentPrivate->pPriorityMgmt->nGroupID = -1; 786 787 788 /* Set pInBufSupplier defaults */ 789 OMX_CONF_INIT_STRUCT(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pParamBufSupplier, OMX_PARAM_BUFFERSUPPLIERTYPE); 790 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pParamBufSupplier->nPortIndex = JPEGDEC_INPUT_PORT; 791 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pParamBufSupplier->eBufferSupplier = OMX_BufferSupplyInput; 792 793 /* Set pOutBufSupplier defaults */ 794 OMX_CONF_INIT_STRUCT(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pParamBufSupplier, OMX_PARAM_BUFFERSUPPLIERTYPE); 795 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pParamBufSupplier->nPortIndex = JPEGDEC_OUTPUT_PORT; 796 pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pParamBufSupplier->eBufferSupplier = OMX_BufferSupplyInput; 797 798 /* Set default value for Max width & Height*/ 799 pComponentPrivate->sMaxResolution.nWidth = JPGDEC_SNTEST_MAX_WIDTH; 800 pComponentPrivate->sMaxResolution.nHeight = JPGDEC_SNTEST_MAX_HEIGHT; 801 802 /*Initialize Component mutex*/ 803 if (pthread_mutex_init(&(pComponentPrivate->mJpegDecMutex), NULL) != 0) 804 { 805 OMX_TRACE4(pComponentPrivate->dbg, "Error at Initialize fill this buffer mutex condition"); 806 eError = OMX_ErrorHardware; 807 goto EXIT; 808 } 809 810 /* initialize a condition variable to its default value */ 811 if (pthread_cond_init(&(pComponentPrivate->sStop_cond), NULL) != 0) 812 { 813 OMX_TRACE4(pComponentPrivate->dbg, "Error at Initialize fill this buffer mutex condition"); 814 eError = OMX_ErrorHardware; 815 goto EXIT; 816 } 817 818 #ifdef KHRONOS_1_1 819 strcpy((char *)pComponentPrivate->componentRole.cRole, "image_decoder.jpeg"); 820 #endif 821 822 823 #ifdef RESOURCE_MANAGER_ENABLED 824 /* load the ResourceManagerProxy thread */ 825 eError = RMProxy_NewInitalizeEx(OMX_COMPONENTTYPE_IMAGE); 826 if (eError != OMX_ErrorNone) { 827 OMX_PRMGR4(pComponentPrivate->dbg, "Error returned from loading ResourceManagerProxy thread: %x\n", eError); 828 goto EXIT; 829 } 830 #endif 831 832 eError= Start_ComponentThreadJpegDec(pHandle); 833 834 835 EXIT: 836 if(eError != OMX_ErrorNone){ 837 /* LinkedList_DisplayAll (&AllocList); */ 838 OMX_FREEALL(); 839 LinkedList_Destroy(&AllocList); 840 } 841 return eError; 842 } /* End of OMX_ComponentInit */ 843 /* ========================================================================== */ 844 /** 845 * @fn SetCallbacks_JPEGDec - Sets application callbacks to the component 846 * @param hComponent - Component handle. 847 * @param pCallBacks - application callbacks 848 * @param pAppData - pointer to application Data 849 * @return: OMX_ERRORTYPE 850 * OMX_ErrorNone on success 851 * !OMX_ErrorNone on any failure 852 */ 853 /* ========================================================================== */ 854 static OMX_ERRORTYPE SetCallbacks_JPEGDec(OMX_HANDLETYPE pComponent, 855 OMX_CALLBACKTYPE* pCallBacks, 856 OMX_PTR pAppData) 857 { 858 OMX_ERRORTYPE eError = OMX_ErrorNone; 859 OMX_COMPONENTTYPE *pHandle = NULL; 860 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 861 862 OMX_CHECK_PARAM(pComponent); 863 864 pHandle = (OMX_COMPONENTTYPE*)pComponent; 865 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 866 867 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1); 868 869 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion SetCallbacks_JPEGDec\n"); 870 871 if (pCallBacks == NULL) { 872 eError = OMX_ErrorBadParameter; 873 OMX_ERROR5(pComponentPrivate->dbg, "Entering funtion SetCallbacks_JPEGDec\n"); 874 goto EXIT; 875 } 876 877 /* Copy the callbacks of the application to the component private */ 878 OMX_MEMCPY_CHECK(&(pComponentPrivate->cbInfo)); 879 memcpy(&(pComponentPrivate->cbInfo), pCallBacks, sizeof(OMX_CALLBACKTYPE)); 880 881 882 /* copy the application private data to component memory */ 883 pHandle->pApplicationPrivate = pAppData; 884 pComponentPrivate->nCurState = OMX_StateLoaded; 885 886 EXIT: 887 return eError; 888 } /* End of SetCallbacks_JPEGDec */ 889 890 891 892 /* ========================================================================== */ 893 /** 894 * @fn GetComponentVersion_JPEGDec - This method will get the component Version. 895 * @param hComp - handle for this instance of the component 896 * @param pComponentName - component name 897 * @param pComponentVersion - component version 898 * @param pSpecVersion - OMX specification version 899 * @param pComponentUUID - UUID of the component 900 * @return: OMX_ERRORTYPE 901 * OMX_ErrorNone on success 902 * !OMX_ErrorNone on any failure 903 */ 904 /* ========================================================================== */ 905 static OMX_ERRORTYPE GetComponentVersion_JPEGDec(OMX_HANDLETYPE hComp, 906 OMX_STRING szComponentName, 907 OMX_VERSIONTYPE* pComponentVersion, 908 OMX_VERSIONTYPE* pSpecVersion, 909 OMX_UUIDTYPE* pComponentUUID) 910 { 911 OMX_ERRORTYPE eError = OMX_ErrorNone; 912 OMX_COMPONENTTYPE * pHandle = NULL; 913 JPEGDEC_COMPONENT_PRIVATE* pComponentPrivate = NULL; 914 OMX_U8 *pTemp = NULL; 915 916 if (!hComp || !szComponentName || !pComponentVersion || !pSpecVersion || !pComponentUUID) { 917 eError = OMX_ErrorBadParameter; 918 goto EXIT; 919 } 920 pHandle = (OMX_COMPONENTTYPE*)hComp; 921 if (!pHandle->pComponentPrivate) { 922 eError = OMX_ErrorBadParameter; 923 goto EXIT; 924 } 925 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE*)pHandle->pComponentPrivate; 926 927 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1); 928 929 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion GetComponentVersion_JPEGDec\n"); 930 931 strncpy(szComponentName, pComponentPrivate->cComponentName, COMP_MAX_NAMESIZE); 932 pTemp = memcpy(pComponentVersion, &(pComponentPrivate->ComponentVersion.s), sizeof(pComponentPrivate->ComponentVersion.s)); 933 if(pTemp == NULL){ 934 eError = OMX_ErrorUndefined; 935 goto EXIT; 936 } 937 pTemp = memcpy(pSpecVersion, &(pComponentPrivate->SpecVersion.s), sizeof(pComponentPrivate->SpecVersion.s)); 938 if(pTemp == NULL){ 939 eError = OMX_ErrorUndefined; 940 goto EXIT; 941 } 942 EXIT: 943 return eError; 944 }/* End of GetComponentVersion_JPEGDec */ 945 946 /* ========================================================================== */ 947 /** 948 * @fn SendCommand_JPEGDec - Sends command from application to component 949 * @param hComponent - handle for this instance of the component 950 * @param Cmd - Command to be sent 951 * @param nParam - Command parameters 952 * @param pCmdData - Additional Command data 953 * @return: OMX_ERRORTYPE 954 * OMX_ErrorNone on success 955 * !OMX_ErrorNone on any failure 956 */ 957 /* ========================================================================== */ 958 static OMX_ERRORTYPE SendCommand_JPEGDec(OMX_HANDLETYPE hComponent, 959 OMX_COMMANDTYPE Cmd, 960 OMX_U32 nParam, 961 OMX_PTR pCmdData) 962 { 963 OMX_ERRORTYPE eError = OMX_ErrorNone; 964 OMX_COMPONENTTYPE *pHandle = NULL; 965 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 966 OMX_PARAM_PORTDEFINITIONTYPE *pPortDefIn= NULL; 967 OMX_PARAM_PORTDEFINITIONTYPE *pPortDefOut = NULL; 968 OMX_MARKTYPE* pMarkType = NULL; 969 OMX_COMMANDTYPE eCmd = OMX_CustomCommandStopThread; 970 int nRet = 0; 971 972 OMX_CHECK_PARAM(hComponent); 973 pHandle = (OMX_COMPONENTTYPE *)hComponent; 974 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 975 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1); 976 977 pPortDefIn = pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef; 978 pPortDefOut = pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef; 979 980 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion SendCommand_JPEGDec %u %lu\n", Cmd, nParam); 981 982 if (pComponentPrivate->nCurState == OMX_StateInvalid) { 983 OMX_PRSTATE4(pComponentPrivate->dbg, "INVALID STATE\n"); 984 eError = OMX_ErrorInvalidState; 985 goto EXIT; 986 } 987 switch (Cmd) { 988 989 case OMX_CommandStateSet: 990 eCmd = OMX_CommandStateSet; 991 pComponentPrivate->nToState = nParam; 992 OMX_PRSTATE2(pComponentPrivate->dbg, "To state %d\n", pComponentPrivate->nToState); 993 break; 994 995 case OMX_CommandFlush: 996 if ((nParam != JPEGDEC_INPUT_PORT) && 997 (nParam != JPEGDEC_OUTPUT_PORT) && 998 ((int)nParam != -1)) { 999 eError = OMX_ErrorBadPortIndex; 1000 goto EXIT; 1001 } 1002 eCmd = OMX_CommandFlush; 1003 OMX_PRBUFFER2(pComponentPrivate->dbg, "get OMX_CommandFlush\n"); 1004 break; 1005 1006 case OMX_CommandPortDisable: 1007 OMX_PRBUFFER2(pComponentPrivate->dbg, "Get port disable command %lu\n", nParam); 1008 if (nParam == JPEGDEC_INPUT_PORT || (int)nParam == -1) { 1009 pPortDefIn->bEnabled = OMX_FALSE; 1010 pComponentPrivate->bInportDisableComplete = OMX_FALSE; 1011 OMX_PRBUFFER2(pComponentPrivate->dbg, "pPortDefIn->bEnabled %d\n", pPortDefIn->bEnabled); 1012 } 1013 if (nParam == JPEGDEC_OUTPUT_PORT || (int)nParam == -1) { 1014 pPortDefOut->bEnabled = OMX_FALSE; 1015 pComponentPrivate->bOutportDisableComplete = OMX_FALSE; 1016 OMX_PRBUFFER2(pComponentPrivate->dbg, "pPortDefIn->bEnabled %d\n", pPortDefIn->bEnabled); 1017 } 1018 if ((nParam != JPEGDEC_INPUT_PORT) && (nParam != JPEGDEC_OUTPUT_PORT) && ((int)nParam != -1)) { 1019 eError = OMX_ErrorBadParameter; 1020 OMX_PRBUFFER4(pComponentPrivate->dbg, "OMX_ErrorBadParameter\n"); 1021 goto EXIT; 1022 } 1023 1024 if (!pPortDefIn->bPopulated) { 1025 pComponentPrivate->bInportDisableComplete = OMX_TRUE; 1026 OMX_PRBUFFER2(pComponentPrivate->dbg, "JPEGDEC_INPUT_PORT: OMX_CommandPortDisable\n"); 1027 pComponentPrivate->cbInfo.EventHandler (pComponentPrivate->pHandle, 1028 pComponentPrivate->pHandle->pApplicationPrivate, 1029 OMX_EventCmdComplete, 1030 OMX_CommandPortDisable, 1031 JPEGDEC_INPUT_PORT, 1032 NULL); 1033 } 1034 1035 if (!pPortDefOut->bPopulated) { 1036 pComponentPrivate->bOutportDisableComplete = OMX_TRUE; 1037 OMX_PRBUFFER1(pComponentPrivate->dbg, "JPEGDEC_OUTPUT_PORT : OMX_CommandPortDisable\n"); 1038 pComponentPrivate->cbInfo.EventHandler (pComponentPrivate->pHandle, 1039 pComponentPrivate->pHandle->pApplicationPrivate, 1040 OMX_EventCmdComplete, 1041 OMX_CommandPortDisable, 1042 JPEGDEC_OUTPUT_PORT, 1043 NULL); 1044 } 1045 eCmd = OMX_CommandPortDisable; 1046 break; 1047 1048 case OMX_CommandPortEnable: 1049 if (nParam == JPEGDEC_INPUT_PORT || (int)nParam == -1) { 1050 pPortDefIn->bEnabled = OMX_TRUE; 1051 } 1052 if (nParam == JPEGDEC_OUTPUT_PORT || (int)nParam == -1) { 1053 pPortDefOut->bEnabled = OMX_TRUE; 1054 } 1055 if ((nParam != JPEGDEC_INPUT_PORT) && (nParam != JPEGDEC_OUTPUT_PORT) && ((int)nParam != -1)) { 1056 eError = OMX_ErrorBadParameter; 1057 goto EXIT; 1058 } 1059 eCmd = OMX_CommandPortEnable; 1060 break; 1061 1062 case OMX_CommandMarkBuffer: 1063 OMX_PRBUFFER2(pComponentPrivate->dbg, "JPEGDEC: Entered switch - Command Mark Buffer\n"); 1064 eCmd = OMX_CommandMarkBuffer; 1065 /* we can only mark buffers on input port */ 1066 if ( nParam != JPEGDEC_INPUT_PORT && nParam != JPEGDEC_OUTPUT_PORT){ 1067 eError = OMX_ErrorBadPortIndex; 1068 goto EXIT; 1069 } 1070 pMarkType =(OMX_MARKTYPE*)pCmdData; 1071 pComponentPrivate->pMarkData = pMarkType->pMarkData; 1072 pComponentPrivate->hMarkTargetComponent = pMarkType->hMarkTargetComponent; 1073 pComponentPrivate->nMarkPort = nParam; 1074 break; 1075 1076 default: 1077 break; 1078 } 1079 1080 OMX_PRINT1(pComponentPrivate->dbg, "JPEGDEC: eCmd = %d\n",(int)eCmd); 1081 1082 #ifdef __PERF_INSTRUMENTATION__ 1083 PERF_SendingCommand(pComponentPrivate->pPERF, 1084 eCmd, (eCmd == OMX_CommandMarkBuffer) ? (OMX_U32) pCmdData : nParam, 1085 PERF_ModuleComponent); 1086 #endif 1087 1088 nRet = write(pComponentPrivate->nCmdPipe[1], &eCmd, sizeof(eCmd)); 1089 if (nRet == -1) { 1090 OMX_PRCOMM4(pComponentPrivate->dbg, "Failed to write into nCmdPipe\n"); 1091 } 1092 1093 /* this needs to be fixed */ 1094 /* port index is redundant for mark buffer as we have 1 input port */ 1095 if (eCmd == OMX_CommandMarkBuffer) { 1096 nRet = write(pComponentPrivate->nCmdDataPipe[1], &pCmdData, sizeof(OMX_PTR)); 1097 if (nRet == -1) { 1098 OMX_PRCOMM4(pComponentPrivate->dbg, "Failed to write into nCmdDataPipe, eCmd = MarkBuf\n"); 1099 } 1100 } 1101 else { 1102 nRet = write(pComponentPrivate->nCmdDataPipe[1], &nParam, sizeof(nParam)); 1103 OMX_PRCOMM2(pComponentPrivate->dbg, "write param %lu to pipe\n", nParam); 1104 if (nRet == -1) { 1105 OMX_PRCOMM4(pComponentPrivate->dbg, "Failed to write into nCmdDataPipe\n"); 1106 } 1107 } 1108 1109 EXIT: 1110 return eError; 1111 } /* End of SendCommand_JPEGDec*/ 1112 1113 1114 1115 /* ========================================================================== */ 1116 /** 1117 * @fn GetParameter_JPEGDec - Gets Parameters from the Component. 1118 * This method will update parameters from the component to the app. 1119 * @param hComponent - handle for this instance of the component 1120 * @param nParamIndex - Component Index Port 1121 * @param ComponentParameterStructure - Component Parameter Structure 1122 * @return: OMX_ERRORTYPE 1123 * OMX_ErrorNone on success 1124 * !OMX_ErrorNone on any failure 1125 */ 1126 /* ========================================================================== */ 1127 static OMX_ERRORTYPE GetParameter_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent, 1128 OMX_IN OMX_INDEXTYPE nParamIndex, 1129 OMX_INOUT OMX_PTR ComponentParameterStructure) 1130 { 1131 OMX_ERRORTYPE eError = OMX_ErrorNone; 1132 OMX_COMPONENTTYPE *pComp = NULL; 1133 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 1134 1135 OMX_CHECK_PARAM(hComponent); 1136 OMX_CHECK_PARAM(ComponentParameterStructure); 1137 pComp = (OMX_COMPONENTTYPE *)hComponent; 1138 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE*)pComp->pComponentPrivate; 1139 1140 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1); 1141 1142 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion GetParameter_JPEGDec\n"); 1143 1144 if (pComponentPrivate->nCurState == OMX_StateInvalid) { 1145 eError = OMX_ErrorIncorrectStateOperation; 1146 goto PRINT_EXIT; 1147 } 1148 1149 switch (nParamIndex) { 1150 #ifdef KHRONOS_1_1 1151 case OMX_IndexParamAudioInit: 1152 memcpy(ComponentParameterStructure, pComponentPrivate->pAudioPortType, sizeof(OMX_PORT_PARAM_TYPE)); 1153 OMX_MEMCPY_CHECK(ComponentParameterStructure); 1154 1155 break; 1156 1157 case OMX_IndexParamVideoInit: 1158 memcpy(ComponentParameterStructure, pComponentPrivate->pVideoPortType, sizeof(OMX_PORT_PARAM_TYPE)); 1159 OMX_MEMCPY_CHECK(ComponentParameterStructure); 1160 1161 break; 1162 1163 case OMX_IndexParamOtherInit: 1164 memcpy(ComponentParameterStructure, pComponentPrivate->pOtherPortType, sizeof(OMX_PORT_PARAM_TYPE)); 1165 OMX_MEMCPY_CHECK(ComponentParameterStructure); 1166 1167 break; 1168 #endif 1169 case OMX_IndexParamImageInit: 1170 memcpy(ComponentParameterStructure, pComponentPrivate->pPortParamType, sizeof(OMX_PORT_PARAM_TYPE)); 1171 OMX_MEMCPY_CHECK(ComponentParameterStructure); 1172 break; 1173 1174 case OMX_IndexParamPortDefinition: 1175 OMX_PRINT1(pComponentPrivate->dbg, "get param %lu\n", ((OMX_PARAM_PORTDEFINITIONTYPE *)(ComponentParameterStructure))->nPortIndex); 1176 OMX_PRINT1(pComponentPrivate->dbg, " port 0 enable: %d\n", pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->bEnabled); 1177 OMX_PRINT1(pComponentPrivate->dbg, " port 1 enable: %d\n", pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->bEnabled); 1178 if (((OMX_PARAM_PORTDEFINITIONTYPE *)(ComponentParameterStructure))->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->nPortIndex) { 1179 memcpy(ComponentParameterStructure, pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef, sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); 1180 } 1181 else if (((OMX_PARAM_PORTDEFINITIONTYPE *)(ComponentParameterStructure))->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->nPortIndex) { 1182 memcpy(ComponentParameterStructure, pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef, sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); 1183 } 1184 else { 1185 eError = OMX_ErrorBadPortIndex; 1186 } 1187 break; 1188 1189 case OMX_IndexParamImagePortFormat: 1190 if (((OMX_IMAGE_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat->nPortIndex) { 1191 if (((OMX_IMAGE_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nIndex > pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat->nIndex) { 1192 eError = OMX_ErrorNoMore; 1193 } 1194 else { 1195 memcpy(ComponentParameterStructure, pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat, sizeof(OMX_IMAGE_PARAM_PORTFORMATTYPE)); 1196 } 1197 } 1198 else if (((OMX_IMAGE_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat->nPortIndex) { 1199 if (((OMX_IMAGE_PARAM_PORTFORMATTYPE *)(ComponentParameterStructure))->nIndex > pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat->nIndex) { 1200 eError = OMX_ErrorNoMore; 1201 } 1202 else { 1203 memcpy(ComponentParameterStructure, pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat, sizeof(OMX_IMAGE_PARAM_PORTFORMATTYPE)); 1204 1205 } 1206 } 1207 else { 1208 eError = OMX_ErrorBadPortIndex; 1209 } 1210 break; 1211 1212 case OMX_IndexParamPriorityMgmt: 1213 memcpy(ComponentParameterStructure, pComponentPrivate->pPriorityMgmt, sizeof(OMX_PRIORITYMGMTTYPE)); 1214 break; 1215 1216 case OMX_IndexParamCompBufferSupplier: 1217 { 1218 OMX_PARAM_BUFFERSUPPLIERTYPE *pBuffSupplierParam = (OMX_PARAM_BUFFERSUPPLIERTYPE *)ComponentParameterStructure; 1219 if (pBuffSupplierParam->nPortIndex == 1) { 1220 pBuffSupplierParam->eBufferSupplier = pComponentPrivate->pCompPort[pBuffSupplierParam->nPortIndex]->pParamBufSupplier->eBufferSupplier; 1221 } 1222 else if (pBuffSupplierParam->nPortIndex == 0) { 1223 pBuffSupplierParam->eBufferSupplier = pComponentPrivate->pCompPort[pBuffSupplierParam->nPortIndex]->pParamBufSupplier->eBufferSupplier; 1224 } 1225 else { 1226 eError = OMX_ErrorBadPortIndex; 1227 } 1228 break; 1229 } 1230 1231 #ifdef KHRONOS_1_1 1232 1233 case OMX_IndexParamQuantizationTable: 1234 { 1235 memcpy(ComponentParameterStructure, pComponentPrivate->pQuantTable, sizeof(OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE)); 1236 OMX_MEMCPY_CHECK(ComponentParameterStructure); 1237 } 1238 break; 1239 1240 case OMX_IndexParamHuffmanTable: 1241 { 1242 memcpy(ComponentParameterStructure, pComponentPrivate->pHuffmanTable, sizeof(OMX_IMAGE_PARAM_HUFFMANTTABLETYPE)); 1243 OMX_MEMCPY_CHECK(ComponentParameterStructure); 1244 } 1245 break; 1246 1247 #endif 1248 case OMX_IndexCustomSectionDecode: 1249 { 1250 memcpy(ComponentParameterStructure, pComponentPrivate->pSectionDecode, sizeof(OMX_CUSTOM_IMAGE_DECODE_SECTION)); 1251 OMX_MEMCPY_CHECK(ComponentParameterStructure); 1252 } 1253 break; 1254 1255 case OMX_IndexCustomSubRegionDecode: 1256 { 1257 memcpy(ComponentParameterStructure, pComponentPrivate->pSubRegionDecode, sizeof(OMX_CUSTOM_IMAGE_DECODE_SUBREGION)); 1258 OMX_MEMCPY_CHECK(ComponentParameterStructure); 1259 } 1260 break; 1261 1262 case OMX_IndexCustomSetMaxResolution: 1263 { 1264 memcpy(ComponentParameterStructure, &(pComponentPrivate->sMaxResolution), sizeof(OMX_CUSTOM_RESOLUTION)); 1265 OMX_MEMCPY_CHECK(ComponentParameterStructure); 1266 } 1267 break; 1268 1269 default: 1270 eError = OMX_ErrorUnsupportedIndex; 1271 break; 1272 } 1273 1274 PRINT_EXIT: 1275 OMX_PRINT1(pComponentPrivate->dbg, "EXIT\n"); 1276 EXIT: 1277 return eError; 1278 } /* End of GetParameter_JPEGDec */ 1279 1280 1281 1282 /* ========================================================================== */ 1283 /** 1284 * @fn SetParameter_JPEGDec - Sets the parameters sent by the Application and 1285 * sets it to the component 1286 * @param hComponent - handle for this instance of the component 1287 * @param nParamIndex - Component Index Port 1288 * @param ComponentParameterStructure - Component Parameter Structure to set 1289 * @return: OMX_ERRORTYPE 1290 * OMX_ErrorNone on success 1291 * !OMX_ErrorNone on any failure 1292 */ 1293 /* ========================================================================== */ 1294 static OMX_ERRORTYPE SetParameter_JPEGDec(OMX_HANDLETYPE hComponent, 1295 OMX_INDEXTYPE nParamIndex, 1296 OMX_PTR pCompParam) 1297 { 1298 OMX_COMPONENTTYPE* pHandle = NULL; 1299 OMX_ERRORTYPE eError = OMX_ErrorNone; 1300 JPEGDEC_COMPONENT_PRIVATE * pComponentPrivate = NULL; 1301 1302 OMX_CHECK_PARAM(hComponent); 1303 OMX_CHECK_PARAM(pCompParam); 1304 1305 pHandle = (OMX_COMPONENTTYPE*)hComponent; 1306 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE*)pHandle->pComponentPrivate; 1307 1308 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1); 1309 1310 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion SetParameter_JPEGDec\n"); 1311 1312 if (pComponentPrivate->nCurState != OMX_StateLoaded) { 1313 eError = OMX_ErrorIncorrectStateOperation; 1314 goto EXIT; 1315 } 1316 1317 switch (nParamIndex) { 1318 #ifdef KHRONOS_1_1 1319 case OMX_IndexParamAudioPortFormat: 1320 { 1321 OMX_AUDIO_PARAM_PORTFORMATTYPE* pComponentParam = (OMX_AUDIO_PARAM_PORTFORMATTYPE *)pCompParam; 1322 if ( pComponentParam->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat->nPortIndex ) { 1323 memcpy(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat, pComponentParam, sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE)); 1324 OMX_MEMCPY_CHECK(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat); 1325 } 1326 else if ( pComponentParam->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat->nPortIndex ) { 1327 memcpy(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat, pComponentParam, sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE)); 1328 OMX_MEMCPY_CHECK(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat); 1329 } 1330 else { 1331 eError = OMX_ErrorBadPortIndex; 1332 } 1333 1334 break; 1335 } 1336 1337 case OMX_IndexParamVideoPortFormat: 1338 { 1339 OMX_VIDEO_PARAM_PORTFORMATTYPE* pComponentParam = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)pCompParam; 1340 if ( pComponentParam->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat->nPortIndex ) { 1341 memcpy(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat, pComponentParam, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE)); 1342 OMX_MEMCPY_CHECK(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat); 1343 } 1344 else if ( pComponentParam->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat->nPortIndex ) { 1345 memcpy(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat, pComponentParam, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE)); 1346 OMX_MEMCPY_CHECK(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat); 1347 } 1348 else { 1349 eError = OMX_ErrorBadPortIndex; 1350 } 1351 1352 break; 1353 } 1354 1355 case OMX_IndexParamOtherPortFormat: 1356 { 1357 OMX_OTHER_PARAM_PORTFORMATTYPE* pComponentParam = (OMX_OTHER_PARAM_PORTFORMATTYPE *)pCompParam; 1358 if ( pComponentParam->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat->nPortIndex ) { 1359 memcpy(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat, pComponentParam, sizeof(OMX_OTHER_PARAM_PORTFORMATTYPE)); 1360 OMX_MEMCPY_CHECK(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat); 1361 } 1362 else if ( pComponentParam->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat->nPortIndex ) { 1363 memcpy(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat, pComponentParam, sizeof(OMX_OTHER_PARAM_PORTFORMATTYPE)); 1364 OMX_MEMCPY_CHECK(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat); 1365 } 1366 else { 1367 eError = OMX_ErrorBadPortIndex; 1368 } 1369 1370 break; 1371 } 1372 #endif 1373 case OMX_IndexParamImagePortFormat: 1374 { 1375 OMX_IMAGE_PARAM_PORTFORMATTYPE* pComponentParam = (OMX_IMAGE_PARAM_PORTFORMATTYPE *)pCompParam; 1376 if (pComponentParam->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat->nPortIndex) { 1377 OMX_MEMCPY_CHECK(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat); 1378 memcpy(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortFormat, pComponentParam, sizeof(OMX_IMAGE_PARAM_PORTFORMATTYPE)); 1379 } 1380 else if (pComponentParam->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat->nPortIndex) { 1381 OMX_MEMCPY_CHECK(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat); 1382 memcpy(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortFormat, pComponentParam, sizeof(OMX_IMAGE_PARAM_PORTFORMATTYPE)); 1383 } 1384 else { 1385 eError = OMX_ErrorBadPortIndex; 1386 } 1387 break; 1388 } 1389 1390 case OMX_IndexParamImageInit: 1391 OMX_MEMCPY_CHECK(pComponentPrivate->pPortParamType); 1392 memcpy(pComponentPrivate->pPortParamType, (OMX_PORT_PARAM_TYPE*)pCompParam, sizeof(OMX_PORT_PARAM_TYPE)); 1393 break; 1394 1395 case OMX_IndexParamPortDefinition: 1396 { 1397 OMX_PARAM_PORTDEFINITIONTYPE* pComponentParam = (OMX_PARAM_PORTDEFINITIONTYPE *)pCompParam; 1398 if (pComponentParam->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->nPortIndex) { 1399 OMX_MEMCPY_CHECK(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef); 1400 memcpy(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef, pComponentParam, sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); 1401 } 1402 else if (pComponentParam->nPortIndex == pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->nPortIndex) { 1403 OMX_MEMCPY_CHECK(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef); 1404 memcpy(pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef, pComponentParam, sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); 1405 } 1406 else { 1407 eError = OMX_ErrorBadPortIndex; 1408 } 1409 break; 1410 } 1411 1412 case OMX_IndexParamPriorityMgmt: 1413 OMX_MEMCPY_CHECK(pComponentPrivate->pPriorityMgmt); 1414 memcpy(pComponentPrivate->pPriorityMgmt, (OMX_PRIORITYMGMTTYPE*)pCompParam, sizeof(OMX_PRIORITYMGMTTYPE)); 1415 break; 1416 1417 case OMX_IndexParamCompBufferSupplier: 1418 { 1419 OMX_PARAM_BUFFERSUPPLIERTYPE *pBuffSupplierParam = (OMX_PARAM_BUFFERSUPPLIERTYPE *)pCompParam; 1420 1421 if (pBuffSupplierParam->nPortIndex == 1) { 1422 /* Copy parameters to input port buffer supplier type */ 1423 pComponentPrivate->pCompPort[pBuffSupplierParam->nPortIndex]->pParamBufSupplier->eBufferSupplier= pBuffSupplierParam->eBufferSupplier; 1424 } 1425 else if (pBuffSupplierParam->nPortIndex == 0) { 1426 pComponentPrivate->pCompPort[pBuffSupplierParam->nPortIndex]->pParamBufSupplier->eBufferSupplier = pBuffSupplierParam->eBufferSupplier; 1427 } 1428 else { 1429 eError = OMX_ErrorBadPortIndex; 1430 break; 1431 } 1432 break; 1433 } 1434 #ifdef KHRONOS_1_1 1435 1436 case OMX_IndexParamQuantizationTable: 1437 { 1438 OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE* pQuantizationTable = (OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE*)pCompParam; 1439 OMX_MEMCPY_CHECK(pQuantizationTable); 1440 OMX_MEMCPY_CHECK(pComponentPrivate->pQuantTable); 1441 memcpy(pComponentPrivate->pQuantTable, pQuantizationTable, sizeof(OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE)); 1442 } 1443 break; 1444 1445 case OMX_IndexParamStandardComponentRole: 1446 { 1447 OMX_PARAM_COMPONENTROLETYPE* pRole = (OMX_PARAM_COMPONENTROLETYPE *)pCompParam; 1448 OMX_MEMCPY_CHECK(pRole); 1449 OMX_MEMCPY_CHECK(pComponentPrivate->pCompRole); 1450 memcpy(pComponentPrivate->pCompRole, pRole, sizeof(OMX_PARAM_COMPONENTROLETYPE )); 1451 } 1452 break; 1453 1454 1455 case OMX_IndexParamHuffmanTable: 1456 { 1457 OMX_IMAGE_PARAM_HUFFMANTTABLETYPE* pHuffmanTable = (OMX_IMAGE_PARAM_HUFFMANTTABLETYPE *)pCompParam; 1458 OMX_MEMCPY_CHECK(pHuffmanTable); 1459 OMX_MEMCPY_CHECK(pComponentPrivate->pHuffmanTable); 1460 memcpy(pComponentPrivate->pHuffmanTable, pHuffmanTable, sizeof(OMX_IMAGE_PARAM_HUFFMANTTABLETYPE )); 1461 } 1462 break; 1463 1464 #endif 1465 1466 case OMX_IndexCustomSectionDecode: 1467 { 1468 OMX_CUSTOM_IMAGE_DECODE_SECTION* pSectionDecode = pCompParam; 1469 OMX_MEMCPY_CHECK(pSectionDecode); 1470 OMX_MEMCPY_CHECK(pComponentPrivate->pSectionDecode); 1471 memcpy(pComponentPrivate->pSectionDecode, pSectionDecode, sizeof(OMX_CUSTOM_IMAGE_DECODE_SECTION)); 1472 } 1473 break; 1474 1475 case OMX_IndexCustomSubRegionDecode: 1476 { 1477 OMX_CUSTOM_IMAGE_DECODE_SUBREGION* pSubRegionDecode = pCompParam; 1478 OMX_MEMCPY_CHECK(pSubRegionDecode); 1479 OMX_MEMCPY_CHECK(pComponentPrivate->pSubRegionDecode); 1480 memcpy(pComponentPrivate->pSubRegionDecode, pSubRegionDecode, sizeof(OMX_CUSTOM_IMAGE_DECODE_SUBREGION)); 1481 } 1482 break; 1483 1484 case OMX_IndexCustomSetMaxResolution: 1485 { 1486 OMX_MEMCPY_CHECK(pCompParam); 1487 memcpy(&(pComponentPrivate->sMaxResolution), pCompParam, sizeof(OMX_CUSTOM_RESOLUTION)); 1488 } 1489 break; 1490 1491 1492 default: 1493 eError = OMX_ErrorUnsupportedIndex; 1494 break; 1495 } 1496 1497 EXIT: 1498 return eError; 1499 } /* End of SetParameter_JPEGDec */ 1500 1501 1502 1503 /* ========================================================================== */ 1504 /** 1505 * @fn GetConfig_JPEGDec - Gets Configuration data from the Component 1506 * @param hComp - handle for this instance of the component 1507 * @param nConfigIndex - Component Config Index Port 1508 * @param ComponentConfigStructure - Component Config Structure 1509 * @return: OMX_ERRORTYPE 1510 * OMX_ErrorNone on success 1511 * !OMX_ErrorNone on any failure 1512 */ 1513 /* ========================================================================== */ 1514 static OMX_ERRORTYPE GetConfig_JPEGDec(OMX_HANDLETYPE hComp, 1515 OMX_INDEXTYPE nConfigIndex, 1516 OMX_PTR ComponentConfigStructure) 1517 { 1518 OMX_ERRORTYPE eError = OMX_ErrorNone; 1519 OMX_COMPONENTTYPE* pHandle = NULL; 1520 JPEGDEC_COMPONENT_PRIVATE * pComponentPrivate = NULL; 1521 1522 OMX_CHECK_PARAM(hComp); 1523 OMX_CHECK_PARAM(ComponentConfigStructure); 1524 pHandle = (OMX_COMPONENTTYPE*)hComp; 1525 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE*)pHandle->pComponentPrivate; 1526 1527 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1); 1528 1529 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion GetConfig_JPEGDec\n"); 1530 1531 switch (nConfigIndex) { 1532 1533 case OMX_IndexConfigCommonScale: 1534 { 1535 int scale=0; 1536 OMX_CONFIG_SCALEFACTORTYPE* pScaleFactor = (OMX_CONFIG_SCALEFACTORTYPE *)ComponentConfigStructure; 1537 memcpy(pScaleFactor, pComponentPrivate->pScalePrivate, sizeof(OMX_CONFIG_SCALEFACTORTYPE)); 1538 1539 scale =(int)pScaleFactor->xWidth; 1540 1541 switch (scale) 1542 { 1543 case (0): 1544 pScaleFactor->xWidth = 100; 1545 break; 1546 1547 case (1): 1548 pScaleFactor->xWidth = 50; 1549 break; 1550 1551 case (2): 1552 pScaleFactor->xWidth = 25; 1553 break; 1554 1555 case (3): 1556 pScaleFactor->xWidth = 12; 1557 break; 1558 1559 case (4): 1560 pScaleFactor->xWidth = 200; 1561 break; 1562 1563 case (5): 1564 pScaleFactor->xWidth = 400; 1565 break; 1566 1567 case (6): 1568 pScaleFactor->xWidth = 800; 1569 break; 1570 1571 default: 1572 pScaleFactor->xWidth = 100; 1573 break; 1574 } 1575 break; 1576 } 1577 1578 case OMX_IndexCustomProgressiveFactor: 1579 { 1580 int *pnProgressiveFlag = (int*)ComponentConfigStructure; 1581 pnProgressiveFlag = (int*)pComponentPrivate->nProgressive; 1582 break; 1583 } 1584 1585 case OMX_IndexCustomDebug: 1586 { 1587 OMX_DBG_GETCONFIG(pComponentPrivate->dbg, ComponentConfigStructure); 1588 break; 1589 } 1590 1591 default: 1592 eError = OMX_ErrorUnsupportedIndex; 1593 break; 1594 } 1595 1596 EXIT: 1597 return eError; 1598 } /* End of GetConfig_JPEGDec */ 1599 1600 1601 1602 /* ========================================================================== */ 1603 /** 1604 * @fn SetConfig_JPEGDec - Sends command to set new configuration 1605 * @param hComp - handle for this instance of the component 1606 * @param nConfigIndex - Component Config Index Port 1607 * @param ComponentConfigStructure - Component Config Structure 1608 * @return: OMX_ERRORTYPE 1609 * OMX_ErrorNone on success 1610 * !OMX_ErrorNone on any failure 1611 */ 1612 /* ========================================================================== */ 1613 static OMX_ERRORTYPE SetConfig_JPEGDec(OMX_HANDLETYPE hComp, 1614 OMX_INDEXTYPE nConfigIndex, 1615 OMX_PTR ComponentConfigStructure) 1616 { 1617 OMX_ERRORTYPE eError = OMX_ErrorNone; 1618 OMX_COMPONENTTYPE* pHandle = NULL; 1619 JPEGDEC_COMPONENT_PRIVATE * pComponentPrivate = NULL; 1620 1621 OMX_CHECK_PARAM(hComp); 1622 OMX_CHECK_PARAM(ComponentConfigStructure); 1623 pHandle = (OMX_COMPONENTTYPE*)hComp; 1624 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE*)pHandle->pComponentPrivate; 1625 1626 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1); 1627 1628 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion SetConfig_JPEGDec\n"); 1629 1630 switch (nConfigIndex) { 1631 1632 case OMX_IndexConfigCommonScale: 1633 { 1634 int scale=0; 1635 OMX_CONFIG_SCALEFACTORTYPE* pScaleFactor = (OMX_CONFIG_SCALEFACTORTYPE *)ComponentConfigStructure; 1636 scale =(int)pScaleFactor->xWidth; 1637 1638 switch (scale) 1639 { 1640 case (800): 1641 pScaleFactor->xWidth = 6; 1642 break; 1643 1644 case (400): 1645 pScaleFactor->xWidth = 5; 1646 break; 1647 1648 case (200): 1649 pScaleFactor->xWidth = 4; 1650 break; 1651 1652 case (100): 1653 pScaleFactor->xWidth = 0; 1654 break; 1655 1656 case (50): 1657 pScaleFactor->xWidth = 1; 1658 break; 1659 1660 case (25): 1661 pScaleFactor->xWidth = 2; 1662 break; 1663 1664 case (12): 1665 pScaleFactor->xWidth = 3; 1666 break; 1667 1668 default: 1669 pScaleFactor->xWidth = 0; 1670 break; 1671 } 1672 1673 OMX_MEMCPY_CHECK(pComponentPrivate->pScalePrivate); 1674 memcpy(pComponentPrivate->pScalePrivate, pScaleFactor, sizeof(OMX_CONFIG_SCALEFACTORTYPE)); 1675 break; 1676 } 1677 1678 case OMX_IndexCustomProgressiveFactor: 1679 { 1680 int *pnProgressive = (int*)ComponentConfigStructure; 1681 pComponentPrivate->nProgressive = (int)*pnProgressive; 1682 break; 1683 } 1684 1685 case OMX_IndexCustomInputFrameWidth: 1686 { 1687 int *pnInputFrameWidth = (int*)ComponentConfigStructure; 1688 pComponentPrivate->nInputFrameWidth = (int)*pnInputFrameWidth; 1689 break; 1690 } 1691 1692 case OMX_IndexCustomOutputColorFormat: 1693 { 1694 int *pnOutputColorFormat = (int*)ComponentConfigStructure; 1695 pComponentPrivate->nOutputColorFormat = (int)*pnOutputColorFormat; 1696 break; 1697 } 1698 1699 case OMX_IndexCustomDebug: 1700 { 1701 OMX_DBG_SETCONFIG(pComponentPrivate->dbg, ComponentConfigStructure); 1702 break; 1703 } 1704 default: 1705 eError = OMX_ErrorUnsupportedIndex; 1706 break; 1707 } 1708 EXIT: 1709 return eError; 1710 } /* End of SetConfig_JPEGDec */ 1711 1712 1713 1714 /* ========================================================================== */ 1715 /** 1716 * @fn GetState - Gets OMX Component State 1717 * @param hComp - handle for this instance of the component 1718 * @param pState - pointer to store State 1719 * @return: OMX_ERRORTYPE 1720 * OMX_ErrorNone on success 1721 * !OMX_ErrorNone on any failure 1722 */ 1723 /* ========================================================================== */ 1724 static OMX_ERRORTYPE GetState(OMX_HANDLETYPE pComponent, 1725 OMX_STATETYPE* pState) 1726 { 1727 OMX_ERRORTYPE eError = 80001012; 1728 OMX_COMPONENTTYPE *pHandle = NULL; 1729 OMX_CHECK_PARAM(pComponent); 1730 pHandle = (OMX_COMPONENTTYPE *)pComponent; 1731 JPEGDEC_COMPONENT_PRIVATE * pComponentPrivate = NULL; 1732 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE*)pHandle->pComponentPrivate; 1733 1734 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1); 1735 1736 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion GetState\n"); 1737 1738 if (!pState) { 1739 eError = OMX_ErrorBadParameter; 1740 goto EXIT; 1741 } 1742 if (pHandle && pHandle->pComponentPrivate) { 1743 *pState = ((JPEGDEC_COMPONENT_PRIVATE*)pHandle->pComponentPrivate)->nCurState; 1744 } 1745 else { 1746 *pState = OMX_StateLoaded; 1747 } 1748 1749 eError = OMX_ErrorNone; 1750 1751 EXIT: 1752 return eError; 1753 } /* End of GetState */ 1754 1755 1756 /* ========================================================================== */ 1757 /** 1758 * @fn EmptyThisBuffer - Send Input Buffers. * The application uses this to 1759 * send the input buffers filled with data to the input port of the component. 1760 * @param hComponent - handle for this instance of the component 1761 * @param pBuffHead - Pointer to data filled 1762 * @return: OMX_ERRORTYPE 1763 * OMX_ErrorNone on success 1764 * !OMX_ErrorNone on any failure 1765 */ 1766 /* ========================================================================== */ 1767 static OMX_ERRORTYPE EmptyThisBuffer(OMX_HANDLETYPE hComponent, 1768 OMX_BUFFERHEADERTYPE* pBuffHead) 1769 { 1770 OMX_ERRORTYPE eError = OMX_ErrorNone; 1771 OMX_COMPONENTTYPE *pHandle = NULL; 1772 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 1773 JPEGDEC_BUFFER_PRIVATE* pBuffPrivate; 1774 int nRet; 1775 int i; 1776 1777 OMX_CHECK_PARAM(hComponent); 1778 pHandle = (OMX_COMPONENTTYPE *)hComponent; 1779 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 1780 1781 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1); 1782 1783 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion EmptyThisBuffer %p\n", pBuffHead); 1784 1785 if ( pComponentPrivate->nCurState != OMX_StateExecuting && 1786 pComponentPrivate->nCurState != OMX_StatePause && 1787 pComponentPrivate->nCurState != OMX_StateIdle) { 1788 eError= OMX_ErrorIncorrectStateOperation; 1789 goto EXIT; 1790 } 1791 1792 if (pBuffHead == NULL) { 1793 eError = OMX_ErrorBadParameter; 1794 goto EXIT; 1795 } 1796 1797 if (pBuffHead->nSize != sizeof(OMX_BUFFERHEADERTYPE)) { 1798 eError = OMX_ErrorBadParameter; 1799 goto EXIT; 1800 } 1801 if (!pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->bEnabled) { 1802 eError = OMX_ErrorIncorrectStateOperation; 1803 goto EXIT; 1804 } 1805 1806 pBuffPrivate = pBuffHead->pInputPortPrivate; 1807 1808 OMX_PRBUFFER1(pComponentPrivate->dbg, "pBuffHead->nAllocLen = %d\n",(int)pBuffHead->nAllocLen); 1809 OMX_PRBUFFER1(pComponentPrivate->dbg, "pBuffHead->nFilledLen = %d\n",(int)pBuffHead->nFilledLen); 1810 OMX_PRBUFFER1(pComponentPrivate->dbg, "pBuffHead->nFlags = %d\n",(int)pBuffHead->nFlags); 1811 1812 if ((pBuffHead->nVersion.s.nVersionMajor != 0x1) || 1813 (pBuffHead->nVersion.s.nVersionMinor != 0x0) || 1814 (pBuffHead->nVersion.s.nRevision != 0x0) || 1815 (pBuffHead->nVersion.s.nStep != 0x0)) { 1816 1817 eError= OMX_ErrorVersionMismatch; 1818 goto EXIT; 1819 } 1820 1821 if (pBuffHead->nInputPortIndex != 0x0) { 1822 eError= OMX_ErrorBadPortIndex; 1823 goto EXIT; 1824 } 1825 pComponentPrivate->nInPortIn ++; 1826 1827 if (pBuffHead->nFlags & OMX_BUFFERFLAG_EOS) { 1828 for (i = 0; i < (int)pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->nBufferCountActual; i ++) { 1829 if (pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->sBufferFlagTrack[i].buffer_id == 0xFFFFFFFF) 1830 { 1831 OMX_PRBUFFER1(pComponentPrivate->dbg, "record buffer id in array %d\n", i); 1832 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->sBufferFlagTrack[i].flag = pBuffHead->nFlags; 1833 pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->sBufferFlagTrack[i].buffer_id = pComponentPrivate->nInPortIn; 1834 break; 1835 } 1836 } 1837 } 1838 1839 /* mark the first buffer from input port after receiving mark buffer command */ 1840 if (pComponentPrivate->nMarkPort == JPEGDEC_INPUT_PORT) { 1841 if (pComponentPrivate->pMarkData) { 1842 OMX_PRBUFFER2(pComponentPrivate->dbg, "get mark buffer command, mark buffer %p\n", pBuffHead); 1843 pBuffHead->pMarkData = pComponentPrivate->pMarkData; 1844 pBuffHead->hMarkTargetComponent = pComponentPrivate->hMarkTargetComponent; 1845 pComponentPrivate->pMarkData = NULL; 1846 pComponentPrivate->hMarkTargetComponent = NULL; 1847 } 1848 } 1849 1850 /* if a buffer from input port is marked, record this port # in the buffer queue */ 1851 if (pBuffHead->pMarkData) { 1852 for (i = 0; i < (int)pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->nBufferCountActual; i ++) { 1853 if (pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->sBufferMarkTrack[i].buffer_id == 0xFFFFFFFF) 1854 { 1855 JPEGDEC_BUFFERMARK_TRACK *pMarkTrack; 1856 pMarkTrack = &(pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->sBufferMarkTrack[i]); 1857 pMarkTrack->buffer_id = pComponentPrivate->nInPortIn; 1858 pMarkTrack->pMarkData = pBuffHead->pMarkData; 1859 pMarkTrack->hMarkTargetComponent = pBuffHead->hMarkTargetComponent; 1860 OMX_PRBUFFER2(pComponentPrivate->dbg, "mark buffer at ID %lu\n", pComponentPrivate->nInPortIn); 1861 break; 1862 } 1863 } 1864 } 1865 1866 1867 pBuffPrivate->bReadFromPipe = OMX_FALSE; 1868 #ifdef __PERF_INSTRUMENTATION__ 1869 PERF_ReceivedFrame(pComponentPrivate->pPERF, 1870 pBuffHead->pBuffer, 1871 pBuffHead->nFilledLen, 1872 PERF_ModuleHLMM); 1873 #endif 1874 1875 1876 pBuffPrivate->eBufferOwner = JPEGDEC_BUFFER_COMPONENT_IN; 1877 1878 nRet = write (pComponentPrivate->nFilled_inpBuf_Q[1], &(pBuffHead), sizeof(pBuffHead)); 1879 if (nRet == -1) { 1880 OMX_PRCOMM4(pComponentPrivate->dbg, "Error while writing to the nFilled_inpBuf_Q pipe\n"); 1881 } 1882 1883 EXIT: 1884 return eError; 1885 } /* End of EmptyThisBuffer */ 1886 1887 1888 1889 /* ========================================================================== */ 1890 /** 1891 * @fn FillThisBuffer_JPEGDec - Send Output Buffers. The application uses this 1892 * to send the empty output buffers to the output port of the component. 1893 * @param hComponent - handle for this instance of the component 1894 * @param pBuffHead - Pointer to buffer header 1895 * @return: OMX_ERRORTYPE 1896 * OMX_ErrorNone on success 1897 * !OMX_ErrorNone on any failure 1898 */ 1899 /* ========================================================================== */ 1900 static OMX_ERRORTYPE FillThisBuffer_JPEGDec(OMX_HANDLETYPE pComponent, 1901 OMX_BUFFERHEADERTYPE* pBuffHead) 1902 { 1903 OMX_ERRORTYPE eError = OMX_ErrorNone; 1904 OMX_COMPONENTTYPE *pHandle = NULL; 1905 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 1906 JPEGDEC_BUFFER_PRIVATE* pBuffPrivate = NULL; 1907 int nRet; 1908 1909 if (pBuffHead == NULL) { 1910 eError = OMX_ErrorBadParameter; 1911 goto EXIT; 1912 } 1913 1914 OMX_CHECK_PARAM(pComponent); 1915 pHandle = (OMX_COMPONENTTYPE *)pComponent; 1916 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 1917 pBuffPrivate = pBuffHead->pOutputPortPrivate; 1918 1919 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1); 1920 1921 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion FillThisBuffer_JPEGDec\n"); 1922 1923 if ( pBuffHead->nSize != sizeof(OMX_BUFFERHEADERTYPE) ) { 1924 1925 eError = OMX_ErrorBadParameter; 1926 goto EXIT; 1927 } 1928 1929 if (pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->bEnabled == OMX_FALSE) { 1930 eError = OMX_ErrorIncorrectStateOperation; 1931 OMX_PRSTATE4(pComponentPrivate->dbg, "eError = OMX_ErrorIncorrectStateOperation\n"); 1932 goto EXIT; 1933 } 1934 1935 1936 1937 if ((pBuffHead->nVersion.s.nVersionMajor != 0x1) || 1938 (pBuffHead->nVersion.s.nVersionMinor != 0x0) || 1939 (pBuffHead->nVersion.s.nRevision != 0x0) || 1940 (pBuffHead->nVersion.s.nStep != 0x0)) { 1941 1942 eError= OMX_ErrorVersionMismatch; 1943 goto EXIT; 1944 } 1945 1946 OMX_PRBUFFER1(pComponentPrivate->dbg, "pBuffHead->nOutputPortIndex %lu\n", pBuffHead->nOutputPortIndex); 1947 1948 if (pBuffHead->nOutputPortIndex != 0x1) { 1949 eError = OMX_ErrorBadPortIndex; 1950 goto EXIT; 1951 } 1952 1953 pBuffHead->nFilledLen = 0; 1954 1955 if ( pComponentPrivate->nCurState != OMX_StateExecuting && 1956 pComponentPrivate->nCurState != OMX_StatePause && 1957 pComponentPrivate->nCurState != OMX_StateIdle) { 1958 eError= OMX_ErrorIncorrectStateOperation; 1959 goto EXIT; 1960 1961 } 1962 1963 #ifdef __PERF_INSTRUMENTATION__ 1964 PERF_ReceivedFrame(pComponentPrivate->pPERF, 1965 pBuffHead->pBuffer, 1966 pBuffHead->nFilledLen, 1967 PERF_ModuleHLMM); 1968 #endif 1969 1970 pBuffPrivate->bReadFromPipe = OMX_FALSE; 1971 pBuffPrivate->eBufferOwner = JPEGDEC_BUFFER_COMPONENT_IN; 1972 nRet = write (pComponentPrivate->nFree_outBuf_Q[1], &(pBuffHead), sizeof (pBuffHead)); 1973 if (nRet == -1) { 1974 OMX_PRCOMM4(pComponentPrivate->dbg, "Error while writing in nFree_outBuf_Q pipe\n"); 1975 } 1976 1977 EXIT: 1978 return eError; 1979 } /* End of FillThisBuffer_JPEGDec */ 1980 1981 1982 /* ========================================================================== */ 1983 /** 1984 * @fn ComponentDeInit - Deinitialize Component. This method will clean all 1985 * resources in the component 1986 * @param hComponent - handle for this instance of the component 1987 * @return: OMX_ERRORTYPE 1988 * OMX_ErrorNone on success 1989 * !OMX_ErrorNone on any failure 1990 */ 1991 /* ========================================================================== */ 1992 OMX_ERRORTYPE ComponentDeInit(OMX_HANDLETYPE hComponent) 1993 { 1994 OMX_ERRORTYPE eError = OMX_ErrorNone; 1995 OMX_COMPONENTTYPE *pHandle = NULL; 1996 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 1997 struct OMX_TI_Debug dbg; 1998 1999 OMX_DBG_INIT_BASE(dbg); 2000 OMX_CHECK_PARAM(hComponent); 2001 pHandle = (OMX_COMPONENTTYPE *)hComponent; 2002 2003 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 2004 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1); 2005 2006 dbg = pComponentPrivate->dbg; 2007 2008 OMX_PRINT1(dbg, "Entering funtion ComponentDeInit\n"); 2009 2010 #ifdef __PERF_INSTRUMENTATION__ 2011 PERF_Boundary(pComponentPrivate->pPERF, 2012 PERF_BoundaryComplete | PERF_BoundaryCleanup); 2013 PERF_Done(pComponentPrivate->pPERF); 2014 #endif 2015 2016 Free_ComponentResourcesJpegDec(pHandle->pComponentPrivate); 2017 2018 #ifdef RESOURCE_MANAGER_ENABLED 2019 eError= RMProxy_NewSendCommand(pHandle, RMProxy_FreeResource, OMX_JPEG_Decoder_COMPONENT, 0, 3456, NULL); 2020 if (eError != OMX_ErrorNone) { 2021 OMX_PRMGR4(dbg, "Cannot Free RMProxy Resources\n"); 2022 } 2023 eError = RMProxy_DeinitalizeEx(OMX_COMPONENTTYPE_IMAGE); 2024 if (eError != OMX_ErrorNone) { 2025 OMX_PRMGR4(dbg, "Error returned from destroy ResourceManagerProxy thread\n"); 2026 } 2027 #endif 2028 2029 EXIT: 2030 OMX_PRINT1(dbg, "Error from Component DeInit = %d\n",eError); 2031 OMX_DBG_CLOSE(dbg); 2032 return eError; 2033 } /* End of ComponentDeInit */ 2034 2035 2036 2037 /* ========================================================================== */ 2038 /** 2039 * @fn VerifyTunnelConnection_JPEGDec - This function verifies the tunnel connection 2040 * @param pPort - port info 2041 * @param hTunneledComp - handle of the component to tunnel 2042 * @param pPortDef - pointer to the port definition. 2043 * @return: OMX_ERRORTYPE 2044 * OMX_ErrorNone on success 2045 * !OMX_ErrorNone on any failure 2046 */ 2047 /* ========================================================================== */ 2048 static OMX_ERRORTYPE VerifyTunnelConnection_JPEGDec(JPEGDEC_PORT_TYPE *pPort, 2049 OMX_HANDLETYPE hTunneledComp, 2050 OMX_PARAM_PORTDEFINITIONTYPE* pPortDef) 2051 { 2052 /* 1.4 Check if input port is compatible with output port */ 2053 OMX_PARAM_PORTDEFINITIONTYPE sPortDef; 2054 OMX_ERRORTYPE eError = OMX_ErrorNone; 2055 OMX_COMPONENTTYPE *pHandle = NULL; 2056 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 2057 pHandle = (OMX_COMPONENTTYPE *)hTunneledComp; 2058 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 2059 2060 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1); 2061 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion VerifyTunnelConnection_JPEGDec\n"); 2062 2063 sPortDef.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); 2064 sPortDef.nVersion.s.nVersionMajor = 0x01; 2065 sPortDef.nVersion.s.nVersionMinor = 0x00; 2066 sPortDef.nPortIndex = pPort->nTunnelPort; 2067 2068 eError = OMX_GetParameter(hTunneledComp, OMX_IndexParamPortDefinition, &sPortDef); 2069 2070 if (eError != OMX_ErrorNone) { 2071 OMX_PRCOMM4(pComponentPrivate->dbg, "Error \n"); 2072 return eError; 2073 } 2074 2075 switch (pPortDef->eDomain) { 2076 2077 case OMX_PortDomainOther: 2078 if (sPortDef.format.other.eFormat!= pPortDef->format.other.eFormat) { 2079 pPort->hTunnelComponent = 0; 2080 pPort->nTunnelPort = 0; 2081 return OMX_ErrorPortsNotCompatible; 2082 } 2083 break; 2084 2085 case OMX_PortDomainAudio: 2086 if (sPortDef.format.audio.eEncoding != pPortDef->format.audio.eEncoding) { 2087 pPort->hTunnelComponent = 0; 2088 pPort->nTunnelPort = 0; 2089 return OMX_ErrorPortsNotCompatible; 2090 } 2091 break; 2092 2093 case OMX_PortDomainVideo: 2094 if (sPortDef.format.video.eCompressionFormat != pPortDef->format.video.eCompressionFormat) { 2095 pPort->hTunnelComponent = 0; 2096 pPort->nTunnelPort = 0; 2097 return OMX_ErrorPortsNotCompatible; 2098 } 2099 break; 2100 2101 case OMX_PortDomainImage: 2102 if (sPortDef.format.image.eCompressionFormat != pPortDef->format.image.eCompressionFormat) { 2103 pPort->hTunnelComponent = 0; 2104 pPort->nTunnelPort = 0; 2105 return OMX_ErrorPortsNotCompatible; 2106 } 2107 break; 2108 2109 default: 2110 pPort->hTunnelComponent = 0; 2111 pPort->nTunnelPort = 0; 2112 return OMX_ErrorPortsNotCompatible; /* Our current port is not set up correctly */ 2113 } 2114 EXIT: 2115 return eError; 2116 } /* End of VerifyTunnelConnection_JPEGDec */ 2117 2118 2119 2120 /* ========================================================================== */ 2121 /** 2122 * @fn ComponentTunnelRequest_JPEGDec - Set a tunnel between two OMx components 2123 * @param hComponent - handle for this instance of the component 2124 * @param nPort - Index Port 2125 * @param hTunneledComp - handle for the istance of the tunneled component 2126 * @param nTunneledPort - index port of the tunneled component 2127 * @param pTunnelSetup - Tunnel setup type 2128 * @return: OMX_ERRORTYPE 2129 * OMX_ErrorNone on success 2130 * !OMX_ErrorNone on any failure 2131 */ 2132 /* ========================================================================== */ 2133 static OMX_ERRORTYPE ComponentTunnelRequest_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent, 2134 OMX_IN OMX_U32 nPort, 2135 OMX_IN OMX_HANDLETYPE hTunneledComp, 2136 OMX_IN OMX_U32 nTunneledPort, 2137 OMX_INOUT OMX_TUNNELSETUPTYPE* pTunnelSetup) 2138 { 2139 OMX_ERRORTYPE eError = OMX_ErrorNone; 2140 OMX_COMPONENTTYPE *pHandle = NULL; 2141 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate = NULL; 2142 OMX_PARAM_BUFFERSUPPLIERTYPE sBufferSupplier; 2143 JPEGDEC_PORT_TYPE *pPort = NULL; 2144 2145 OMX_CHECK_PARAM(hComponent); 2146 pHandle = (OMX_COMPONENTTYPE *)hComponent; 2147 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate; 2148 2149 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1); 2150 2151 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion ComponentTunnelRequest_JPEGDec\n"); 2152 OMX_PRINT1(pComponentPrivate->dbg, "nPort = %lu\n",nPort); 2153 2154 pPort = pComponentPrivate->pCompPort[nPort]; 2155 if (pTunnelSetup == NULL || hTunneledComp == 0) { 2156 /* cancel previous tunnel */ 2157 pPort->hTunnelComponent = 0; 2158 pPort->nTunnelPort = 0; 2159 OMX_PRBUFFER2(pComponentPrivate->dbg, "OMX_BufferSupplyUnspecified\n"); 2160 pPort->pParamBufSupplier->eBufferSupplier = OMX_BufferSupplyUnspecified; 2161 } 2162 else { 2163 if (pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->eDir != OMX_DirInput && pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef->eDir != OMX_DirOutput) { 2164 2165 OMX_PRBUFFER4(pComponentPrivate->dbg, "OMX_ErrorBadParameter\n"); 2166 return OMX_ErrorBadParameter; 2167 } 2168 2169 /* Check if the other component is developed by TI */ 2170 if(IsTIOMXComponent(hTunneledComp) != OMX_TRUE) 2171 { 2172 OMX_PRCOMM4(pComponentPrivate->dbg, "OMX_ErrorTunnelingUnsupported\n"); 2173 eError = OMX_ErrorTunnelingUnsupported; 2174 goto EXIT; 2175 } 2176 2177 pPort->hTunnelComponent = hTunneledComp; 2178 pPort->nTunnelPort = nTunneledPort; 2179 2180 if (pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef && pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pPortDef->nPortIndex == nPort) { 2181 /* Component is the output (source of data) */ 2182 pTunnelSetup->eSupplier = pPort->pParamBufSupplier->eBufferSupplier; 2183 } 2184 else { 2185 /* Component is the input (sink of data) */ 2186 eError = VerifyTunnelConnection_JPEGDec(pPort, hTunneledComp, pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pPortDef); 2187 if (OMX_ErrorNone != eError) { 2188 OMX_PRCOMM5(pComponentPrivate->dbg, "########### Error !! PP VerifyTunnelConnection_JPEGDec failed\n"); 2189 /* Invalid connection formats. Return eError */ 2190 return OMX_ErrorPortsNotCompatible; 2191 } 2192 /* If specified obey output port's preferences. Otherwise choose output */ 2193 pPort->pParamBufSupplier->eBufferSupplier = pTunnelSetup->eSupplier; 2194 if (OMX_BufferSupplyUnspecified == pPort->pParamBufSupplier->eBufferSupplier) { 2195 pPort->pParamBufSupplier->eBufferSupplier = pTunnelSetup->eSupplier = OMX_BufferSupplyOutput; 2196 } 2197 2198 /* Tell the output port who the supplier is */ 2199 sBufferSupplier.nSize = sizeof(sBufferSupplier); 2200 sBufferSupplier.nVersion.s.nVersionMajor = 0x01; 2201 sBufferSupplier.nVersion.s.nVersionMinor = 0x00; 2202 sBufferSupplier.nPortIndex = nTunneledPort; 2203 sBufferSupplier.eBufferSupplier = pPort->pParamBufSupplier->eBufferSupplier; 2204 eError = OMX_SetParameter(hTunneledComp, OMX_IndexParamCompBufferSupplier, &sBufferSupplier); 2205 eError = OMX_GetParameter(hTunneledComp, OMX_IndexParamCompBufferSupplier, &sBufferSupplier); 2206 2207 if (sBufferSupplier.eBufferSupplier != pPort->pParamBufSupplier->eBufferSupplier) { 2208 2209 return OMX_ErrorUndefined; 2210 } 2211 } 2212 } 2213 EXIT: 2214 return eError; 2215 } /* End of ComponentTunnelRequest_JPEGDec */ 2216 2217 2218 /* ========================================================================== */ 2219 /** 2220 * @fn Allocate_DSPResources_JPEGDec - Allocate the Ialg structure for each port's 2221 * buffer header. 2222 * @param hComponent - handle for this instance of the component 2223 * @param nPort - Index Port 2224 * @return: OMX_ERRORTYPE 2225 * OMX_ErrorNone on success 2226 * !OMX_ErrorNone on any failure 2227 */ 2228 /* ========================================================================== */ 2229 static OMX_ERRORTYPE Allocate_DSPResources_JPEGDec(OMX_IN JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate, 2230 OMX_IN OMX_U32 nPortIndex) 2231 { 2232 OMX_ERRORTYPE eError = OMX_ErrorNone; 2233 void *pUalgOutParams; 2234 void *pUalgInpParams; 2235 OMX_U8* pTemp; 2236 OMX_U8 nBufferCount = -1; 2237 2238 JPEGDEC_OMX_CONF_CHECK_CMD(pComponentPrivate, 1, 1); 2239 2240 OMX_PRINT1(pComponentPrivate->dbg, "Entering funtion Allocate_DSPResources_JPEGDec\n"); 2241 2242 nBufferCount = pComponentPrivate->pCompPort[nPortIndex]->nBuffCount; 2243 if (nPortIndex == JPEGDEC_INPUT_PORT) { 2244 OMX_MALLOC(pUalgInpParams, sizeof(JPEGDEC_UAlgInBufParamStruct) + 256); 2245 pTemp = (OMX_U8*)pUalgInpParams; 2246 pTemp += 128; 2247 pUalgInpParams = pTemp; 2248 (pComponentPrivate->pCompPort[JPEGDEC_INPUT_PORT]->pBufferPrivate[nBufferCount]->pUALGParams) = (JPEGDEC_UAlgInBufParamStruct *)(pUalgInpParams); 2249 } 2250 else if (nPortIndex == JPEGDEC_OUTPUT_PORT) { 2251 OMX_MALLOC(pUalgOutParams, sizeof(JPEGDEC_UAlgOutBufParamStruct) + 256); 2252 pTemp = (OMX_U8*)pUalgOutParams; 2253 pTemp += 128; 2254 pUalgOutParams = pTemp; 2255 (pComponentPrivate->pCompPort[JPEGDEC_OUTPUT_PORT]->pBufferPrivate[nBufferCount]->pUALGParams) = (JPEGDEC_UAlgOutBufParamStruct *)(pUalgOutParams); 2256 } 2257 else { 2258 eError = OMX_ErrorBadPortIndex; 2259 goto EXIT; 2260 } 2261 2262 EXIT: 2263 return eError; 2264 } /* End of Allocate_DSPResources_JPEGDec */ 2265 2266 2267 2268 2269 static void JPEGDEC_InitBufferFlagTrack( 2270 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate, 2271 OMX_U32 nPortIndex) 2272 2273 { 2274 JPEGDEC_PORT_TYPE *pPortType = NULL; 2275 int i; 2276 2277 pPortType = pComponentPrivate->pCompPort[nPortIndex]; 2278 2279 /* assume pPortType->pPortDef->nBufferCountActual <= NUM_OF_BUFFERSJPEG */ 2280 for (i = 0; i < (int)pPortType->pPortDef->nBufferCountActual; i ++) { 2281 pPortType->sBufferFlagTrack[i].flag = 0; 2282 pPortType->sBufferFlagTrack[i].buffer_id = 0xFFFFFFFF; 2283 pPortType->sBufferMarkTrack[i].buffer_id = 0xFFFFFFFF; 2284 pPortType->sBufferMarkTrack[i].pMarkData = NULL; 2285 } 2286 } 2287 2288 2289 2290 #ifdef KHRONOS_1_1 2291 /* ========================================================================== */ 2292 /** 2293 * @fn ComponentRoleEnum - 2294 * @param hComponent - handle for this instance of the component 2295 * @param cRole - role performed by the component 2296 * @param nIndex - Index 2297 * @return: OMX_ERRORTYPE 2298 * OMX_ErrorNone on success 2299 * !OMX_ErrorNone on any failure 2300 */ 2301 /* ========================================================================== */ 2302 static OMX_ERRORTYPE ComponentRoleEnum(OMX_IN OMX_HANDLETYPE hComponent, 2303 OMX_OUT OMX_U8 *cRole, 2304 OMX_IN OMX_U32 nIndex) 2305 { 2306 JPEGDEC_COMPONENT_PRIVATE *pComponentPrivate; 2307 OMX_ERRORTYPE eError = OMX_ErrorNone; 2308 pComponentPrivate = (JPEGDEC_COMPONENT_PRIVATE *)(((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate); 2309 2310 if(nIndex == 0){ 2311 strncpy((char *)cRole, (char *)pComponentPrivate->componentRole.cRole, sizeof(OMX_U8) * OMX_MAX_STRINGNAME_SIZE); 2312 } 2313 else { 2314 eError = OMX_ErrorNoMore; 2315 } 2316 2317 return eError; 2318 } 2319 #endif 2320 2321 2322 2323 /*-------------------------------------------------------------------*/ 2324 /** 2325 * GetExtensionIndex_JpegDec() 2326 * 2327 * Free a video driver buffer. 2328 * 2329 * @retval OMX_ErrorNone Successful operation. 2330 * OMX_ErrorBadParameter Invalid operation. 2331 * OMX_ErrorIncorrectStateOperation If called when port is disabled. 2332 **/ 2333 /*-------------------------------------------------------------------*/ 2334 OMX_ERRORTYPE GetExtensionIndex_JPEGDec(OMX_IN OMX_HANDLETYPE hComponent, OMX_IN OMX_STRING cParameterName, OMX_OUT OMX_INDEXTYPE* pIndexType) 2335 { 2336 OMX_U16 nIndex; 2337 OMX_ERRORTYPE eError = OMX_ErrorUndefined; 2338 JPEGDEC_CUSTOM_PARAM_DEFINITION sJpegDecCustomParams[] = { 2339 {"OMX.TI.JPEG.decoder.Config.ProgressiveFactor", OMX_IndexCustomProgressiveFactor}, 2340 {"OMX.TI.JPEG.decoder.Config.InputFrameWidth", OMX_IndexCustomInputFrameWidth}, 2341 {"OMX.TI.JPEG.decoder.Config.OutputColorFormat", OMX_IndexCustomOutputColorFormat}, 2342 {"OMX.TI.JPEG.decoder.Param.SectionDecode", OMX_IndexCustomSectionDecode}, 2343 {"OMX.TI.JPEG.decoder.Param.SubRegionDecode", OMX_IndexCustomSubRegionDecode}, 2344 {"OMX.TI.JPEG.decoder.Param.SetMaxResolution", OMX_IndexCustomSetMaxResolution}, 2345 {"OMX.TI.JPEG.decoder.Debug", OMX_IndexCustomDebug}, 2346 {"",0x0} 2347 }; 2348 2349 /* Check parameter validity */ 2350 OMX_CHECK_PARAM(hComponent); 2351 OMX_CHECK_PARAM(pIndexType); 2352 *pIndexType = OMX_IndexMax; 2353 2354 for (nIndex = 0; strlen((const char*)sJpegDecCustomParams[nIndex].cCustomParamName); nIndex++){ 2355 if (!strcmp((const char*)cParameterName, (const char*)(&(sJpegDecCustomParams[nIndex].cCustomParamName)))){ 2356 *pIndexType = sJpegDecCustomParams[nIndex].nCustomParamIndex; 2357 eError = OMX_ErrorNone; 2358 break; 2359 } 2360 } 2361 2362 if(*pIndexType == OMX_IndexMax){ 2363 eError = OMX_ErrorUnsupportedIndex; 2364 } 2365 2366 2367 EXIT: 2368 return eError; 2369 } 2370