Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (c) 2010, Texas Instruments Incorporated
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  *
      9  * *  Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer.
     11  *
     12  * *  Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  *
     16  * *  Neither the name of Texas Instruments Incorporated nor the names of
     17  *    its contributors may be used to endorse or promote products derived
     18  *    from this software without specific prior written permission.
     19  *
     20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31  */
     32 
     33 /**
     34  *  @file  omx_proxy_common.c
     35  *         This file contains methods that provides the functionality for
     36  *         the OpenMAX1.1 DOMX Framework OMX Common Proxy .
     37  *
     38  *  @path \WTSD_DucatiMMSW\framework\domx\omx_proxy_common\src
     39  *
     40  *  @rev 1.0
     41  */
     42 
     43 /*==============================================================
     44  *! Revision History
     45  *! ============================
     46  *! 29-Mar-2010 Abhishek Ranka : Revamped DOMX implementation
     47  *!
     48  *! 19-August-2009 B Ravi Kiran ravi.kiran (at) ti.com: Initial Version
     49  *================================================================*/
     50 
     51 /* ------compilation control switches ----------------------------------------*/
     52 #define TILER_BUFF
     53 #define ALLOCATE_TILER_BUFFER_IN_PROXY
     54 // This has been enabled enbled only in Android.mk
     55 // #define ENABLE_GRALLOC_BUFFER
     56 /******************************************************************
     57  *   INCLUDE FILES
     58  ******************************************************************/
     59 /* ----- system and platform files ----------------------------*/
     60 #include <string.h>
     61 
     62 #include "timm_osal_memory.h"
     63 #include "timm_osal_mutex.h"
     64 #include "OMX_TI_Common.h"
     65 #include "OMX_TI_Index.h"
     66 #include "OMX_TI_Core.h"
     67 /*-------program files ----------------------------------------*/
     68 #include "omx_proxy_common.h"
     69 #include "omx_rpc.h"
     70 #include "omx_rpc_stub.h"
     71 #include "omx_rpc_utils.h"
     72 #include "OMX_TI_IVCommon.h"
     73 #include "profile.h"
     74 
     75 #ifdef ALLOCATE_TILER_BUFFER_IN_PROXY
     76 
     77 #ifdef USE_ION
     78 #include <unistd.h>
     79 #include <ion/ion.h>
     80 #include <sys/ioctl.h>
     81 #include <sys/mman.h>
     82 #include <sys/eventfd.h>
     83 #include <fcntl.h>
     84 #include <linux/rpmsg_omx.h>
     85 #include <errno.h>
     86 #endif
     87 
     88 #endif
     89 
     90 #ifdef  ENABLE_GRALLOC_BUFFERS
     91 #include "native_handle.h"
     92 #include "hal_public.h"
     93 #endif
     94 
     95 #ifdef TILER_BUFF
     96 #define PortFormatIsNotYUV 0
     97 
     98 static OMX_ERRORTYPE _RPC_IsProxyComponent(OMX_HANDLETYPE hComponent,
     99     OMX_BOOL * bIsProxy);
    100 OMX_ERRORTYPE RPC_UTIL_GetStride(OMX_COMPONENTTYPE * hRemoteComp,
    101     OMX_U32 nPortIndex, OMX_U32 * nStride);
    102 OMX_ERRORTYPE RPC_UTIL_GetNumLines(OMX_COMPONENTTYPE * hComp,
    103     OMX_U32 nPortIndex, OMX_U32 * nNumOfLines);
    104 
    105 #endif
    106 
    107 #ifdef ALLOCATE_TILER_BUFFER_IN_PROXY
    108 
    109 static OMX_ERRORTYPE PROXY_UseBuffer(OMX_IN OMX_HANDLETYPE hComponent,
    110     OMX_INOUT OMX_BUFFERHEADERTYPE ** ppBufferHdr,
    111     OMX_IN OMX_U32 nPortIndex, OMX_IN OMX_PTR pAppPrivate,
    112     OMX_IN OMX_U32 nSizeBytes, OMX_IN OMX_U8 * pBuffer);
    113 #endif
    114 
    115 #define LINUX_PAGE_SIZE 4096
    116 #define MAXNAMESIZE 128
    117 
    118 #define CORE_MAX 4
    119 #define CORE_CHIRON 3
    120 #define CORE_SYSM3 2
    121 #define CORE_APPM3 1
    122 #define CORE_TESLA 0
    123 
    124 #define MAX_CORENAME_LENGTH 32
    125 char Core_Array[][MAX_CORENAME_LENGTH] =
    126     { "TESLA", "DUCATI1", "DUCATI0", "CHIRON" };
    127 
    128 /******************************************************************
    129  *   MACROS - LOCAL
    130  ******************************************************************/
    131 
    132 #ifdef USE_ION
    133 
    134 
    135 RPC_OMX_ERRORTYPE RPC_RegisterBuffer(OMX_HANDLETYPE hRPCCtx, int fd,
    136 				     OMX_PTR *handle1, OMX_PTR *handle2,
    137 				     PROXY_BUFFER_TYPE proxyBufferType)
    138 {
    139 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
    140 	int status;
    141 	RPC_OMX_CONTEXT *pRPCCtx = (RPC_OMX_CONTEXT *) hRPCCtx;
    142 
    143 	if ((fd < 0) || (handle1 ==  NULL) ||
    144 	    ((proxyBufferType == GrallocPointers) && (handle2 ==  NULL))) {
    145 		eRPCError = RPC_OMX_ErrorBadParameter;
    146 		goto EXIT;
    147 	}
    148 
    149 	if (proxyBufferType != GrallocPointers) {
    150 		struct ion_fd_data ion_data;
    151 
    152 		ion_data.fd = fd;
    153 		ion_data.handle = NULL;
    154 		status = ioctl(pRPCCtx->fd_omx, OMX_IOCIONREGISTER, &ion_data);
    155 		if (status < 0) {
    156 			DOMX_ERROR("RegisterBuffer ioctl call failed");
    157 			eRPCError = RPC_OMX_ErrorInsufficientResources;
    158 			goto EXIT;
    159 		}
    160 		if (ion_data.handle)
    161 			*handle1 = ion_data.handle;
    162 	} else {
    163 #ifdef OMX_IOCPVRREGISTER
    164 		struct omx_pvr_data pvr_data;
    165 
    166 		pvr_data.fd = fd;
    167 		memset(pvr_data.handles, 0x0, sizeof(pvr_data.handles));
    168 		status = ioctl(pRPCCtx->fd_omx, OMX_IOCPVRREGISTER, &pvr_data);
    169 		if (status < 0) {
    170 			if (errno == ENOTTY) {
    171 				DOMX_DEBUG("OMX_IOCPVRREGISTER not supported with current kernel version");
    172 			} else {
    173 				DOMX_ERROR("RegisterBuffer ioctl call failed");
    174 				eRPCError = RPC_OMX_ErrorInsufficientResources;
    175 			}
    176 			goto EXIT;
    177 		}
    178 
    179 		if (pvr_data.handles[0])
    180 			*handle1 = pvr_data.handles[0];
    181 		if (pvr_data.handles[1])
    182 			*handle2 = pvr_data.handles[1];
    183 #endif
    184 	}
    185 
    186 
    187  EXIT:
    188 	return eRPCError;
    189 }
    190 
    191 RPC_OMX_ERRORTYPE RPC_UnRegisterBuffer(OMX_HANDLETYPE hRPCCtx, OMX_PTR handle)
    192 {
    193 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
    194 	int status;
    195 	struct ion_fd_data data;
    196 	RPC_OMX_CONTEXT *pRPCCtx = (RPC_OMX_CONTEXT *) hRPCCtx;
    197 
    198 	if (handle ==  NULL) {
    199 		eRPCError = RPC_OMX_ErrorBadParameter;
    200 		goto EXIT;
    201 	}
    202 
    203 	data.handle = handle;
    204 	status = ioctl(pRPCCtx->fd_omx, OMX_IOCIONUNREGISTER, &data);
    205 	if (status < 0) {
    206 		eRPCError = RPC_OMX_ErrorInsufficientResources;
    207 		goto EXIT;
    208 	}
    209 
    210  EXIT:
    211 	return eRPCError;
    212 }
    213 
    214 static OMX_ERRORTYPE PROXY_AllocateBufferIonCarveout(PROXY_COMPONENT_PRIVATE *pCompPrv,
    215 						 size_t len, struct ion_handle **handle)
    216 {
    217 	int fd;
    218 	int ret;
    219 	struct ion_handle *temp;
    220 	size_t stride;
    221 
    222 	ret = ion_alloc(pCompPrv->ion_fd, len, 0x1000, 1 << ION_HEAP_TYPE_CARVEOUT, &temp);
    223 
    224        if (ret || ((int)temp == -ENOMEM)) {
    225                ret = ion_alloc_tiler(pCompPrv->ion_fd, len, 1, TILER_PIXEL_FMT_PAGE,
    226                        OMAP_ION_HEAP_TILER_MASK, &temp, &stride);
    227        }
    228 
    229        if (ret || ((int)temp == -ENOMEM)) {
    230                DOMX_ERROR("FAILED to allocate buffer of size=%d. ret=0x%x",len, ret);
    231                return OMX_ErrorInsufficientResources;
    232        }
    233 
    234 	if (ret)
    235 		return OMX_ErrorInsufficientResources;
    236 	*handle = temp;
    237 	return OMX_ErrorNone;
    238 }
    239 #endif
    240 
    241 /* ===========================================================================*/
    242 /**
    243  * @name PROXY_EventHandler()
    244  * @brief
    245  * @param void
    246  * @return OMX_ErrorNone = Successful
    247  * @sa TBD
    248  *
    249  */
    250 /* ===========================================================================*/
    251 OMX_ERRORTYPE PROXY_EventHandler(OMX_HANDLETYPE hComponent,
    252     OMX_PTR pAppData, OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2,
    253     OMX_PTR pEventData)
    254 {
    255 	OMX_ERRORTYPE eError = OMX_ErrorNone;
    256 	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
    257 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
    258 	OMX_PTR pTmpData = NULL;
    259 
    260 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
    261 
    262 	PROXY_require((hComp->pComponentPrivate != NULL),
    263 	    OMX_ErrorBadParameter,
    264 	    "This is fatal error, processing cant proceed - please debug");
    265 
    266 	DOMX_ENTER
    267 	    ("hComponent=%p, pCompPrv=%p, eEvent=%p, nData1=%p, nData2=%p, pEventData=%p",
    268 	    hComponent, pCompPrv, eEvent, nData1, nData2, pEventData);
    269 
    270 	switch (eEvent)
    271 	{
    272 #if 0	// This feature is currently not supported, so kept in if(0) to be supported in the future
    273 	case OMX_TI_EventBufferRefCount:
    274 		DOMX_DEBUG("Received Ref Count Event");
    275 		/*nData1 will be pBufferHeader, nData2 will be present count. Need to find local
    276 		   buffer header for nData1 which is remote buffer header */
    277 
    278 		PROXY_assert((nData1 != 0), OMX_ErrorBadParameter,
    279 		    "Received NULL buffer header from OMX component");
    280 
    281 		/*find local buffer header equivalent */
    282 		for (count = 0; count < pCompPrv->nTotalBuffers; ++count)
    283 		{
    284 			if (pCompPrv->tBufList[count].pBufHeaderRemote ==
    285 			    nData1)
    286 			{
    287 				pLocalBufHdr =
    288 				    pCompPrv->tBufList[count].pBufHeader;
    289 				pLocalBufHdr->pBuffer =
    290 				    (OMX_U8 *) pCompPrv->tBufList[count].
    291 				    pBufferActual;
    292 				break;
    293 			}
    294 		}
    295 		PROXY_assert((count != pCompPrv->nTotalBuffers),
    296 		    OMX_ErrorBadParameter,
    297 		    "Received invalid-buffer header from OMX component");
    298 
    299 		/*update local buffer header */
    300 		nData1 = (OMX_U32) pLocalBufHdr;
    301 		break;
    302 #endif
    303 	case OMX_EventMark:
    304 		DOMX_DEBUG("Received Mark Event");
    305 		PROXY_assert((pEventData != NULL), OMX_ErrorUndefined,
    306 		    "MarkData corrupted");
    307 		pTmpData = pEventData;
    308 		pEventData =
    309 		    ((PROXY_MARK_DATA *) pEventData)->pMarkDataActual;
    310 		TIMM_OSAL_Free(pTmpData);
    311 		break;
    312 
    313 	default:
    314 		break;
    315 	}
    316 
    317       EXIT:
    318 	if (eError == OMX_ErrorNone)
    319 	{
    320 		pCompPrv->tCBFunc.EventHandler(hComponent,
    321 		    pCompPrv->pILAppData, eEvent, nData1, nData2, pEventData);
    322 	} else if (pCompPrv)
    323 	{
    324 		pCompPrv->tCBFunc.EventHandler(hComponent,
    325 		    pCompPrv->pILAppData, OMX_EventError, eError, 0, NULL);
    326 	}
    327 
    328 	DOMX_EXIT("eError: %d", eError);
    329 	return OMX_ErrorNone;
    330 }
    331 
    332 /* ===========================================================================*/
    333 /**
    334  * @name PROXY_EmptyBufferDone()
    335  * @brief
    336  * @param
    337  * @return OMX_ErrorNone = Successful
    338  * @sa TBD
    339  *
    340  */
    341 /* ===========================================================================*/
    342 static OMX_ERRORTYPE PROXY_EmptyBufferDone(OMX_HANDLETYPE hComponent,
    343     OMX_U32 remoteBufHdr, OMX_U32 nfilledLen, OMX_U32 nOffset, OMX_U32 nFlags)
    344 {
    345 	OMX_ERRORTYPE eError = OMX_ErrorNone;
    346 	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
    347 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
    348 	OMX_U16 count;
    349 	OMX_BUFFERHEADERTYPE *pBufHdr = NULL;
    350 
    351 	PROXY_require((hComp->pComponentPrivate != NULL),
    352 	    OMX_ErrorBadParameter,
    353 	    "This is fatal error, processing cant proceed - please debug");
    354 
    355 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
    356 
    357 	DOMX_ENTER
    358 	    ("hComponent=%p, pCompPrv=%p, remoteBufHdr=%p, nFilledLen=%d, nOffset=%d, nFlags=%08x",
    359 	    hComponent, pCompPrv, remoteBufHdr, nfilledLen, nOffset, nFlags);
    360 
    361 	for (count = 0; count < pCompPrv->nTotalBuffers; ++count)
    362 	{
    363 		if (pCompPrv->tBufList[count].pBufHeaderRemote ==
    364 		    remoteBufHdr)
    365 		{
    366 			pBufHdr = pCompPrv->tBufList[count].pBufHeader;
    367 			pBufHdr->nFilledLen = nfilledLen;
    368 			pBufHdr->nOffset = nOffset;
    369 			pBufHdr->nFlags = nFlags;
    370 			/* Setting mark info to NULL. This would always be
    371 			   NULL in EBD, whether component has propagated the
    372 			   mark or has generated mark event */
    373 			pBufHdr->hMarkTargetComponent = NULL;
    374 			pBufHdr->pMarkData = NULL;
    375 			break;
    376 		}
    377 	}
    378 	PROXY_assert((count != pCompPrv->nTotalBuffers),
    379 	    OMX_ErrorBadParameter,
    380 	    "Received invalid-buffer header from OMX component");
    381 
    382 	KPI_OmxCompBufferEvent(KPI_BUFFER_EBD, hComponent, &(pCompPrv->tBufList[count]));
    383 
    384       EXIT:
    385 	if (eError == OMX_ErrorNone)
    386 	{
    387 		pCompPrv->tCBFunc.EmptyBufferDone(hComponent,
    388 		    pCompPrv->pILAppData, pBufHdr);
    389 	} else if (pCompPrv)
    390 	{
    391 		pCompPrv->tCBFunc.EventHandler(hComponent,
    392 		    pCompPrv->pILAppData, OMX_EventError, eError, 0, NULL);
    393 	}
    394 
    395 	DOMX_EXIT("eError: %d", eError);
    396 	return OMX_ErrorNone;
    397 }
    398 
    399 /* ===========================================================================*/
    400 /**
    401  * @name PROXY_FillBufferDone()
    402  * @brief
    403  * @param
    404  * @return OMX_ErrorNone = Successful
    405  * @sa TBD
    406  *
    407  */
    408 /* ===========================================================================*/
    409 OMX_ERRORTYPE PROXY_FillBufferDone(OMX_HANDLETYPE hComponent,
    410     OMX_U32 remoteBufHdr, OMX_U32 nfilledLen, OMX_U32 nOffset, OMX_U32 nFlags,
    411     OMX_TICKS nTimeStamp, OMX_HANDLETYPE hMarkTargetComponent,
    412     OMX_PTR pMarkData)
    413 {
    414 
    415 	OMX_ERRORTYPE eError = OMX_ErrorNone;
    416 	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
    417 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
    418 	OMX_U16 count;
    419 	OMX_BUFFERHEADERTYPE *pBufHdr = NULL;
    420 
    421 	PROXY_require((hComp->pComponentPrivate != NULL),
    422 	    OMX_ErrorBadParameter,
    423 	    "This is fatal error, processing cant proceed - please debug");
    424 
    425 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
    426 
    427 	DOMX_ENTER
    428 	    ("hComponent=%p, pCompPrv=%p, remoteBufHdr=%p, nFilledLen=%d, nOffset=%d, nFlags=%08x",
    429 	    hComponent, pCompPrv, remoteBufHdr, nfilledLen, nOffset, nFlags);
    430 
    431 	for (count = 0; count < pCompPrv->nTotalBuffers; ++count)
    432 	{
    433 		if (pCompPrv->tBufList[count].pBufHeaderRemote ==
    434 		    remoteBufHdr)
    435 		{
    436 			pBufHdr = pCompPrv->tBufList[count].pBufHeader;
    437 			pBufHdr->nFilledLen = nfilledLen;
    438 			pBufHdr->nOffset = nOffset;
    439 			pBufHdr->nFlags = nFlags;
    440 			pBufHdr->nTimeStamp = nTimeStamp;
    441 			if (pMarkData != NULL)
    442 			{
    443 				/*Update mark info in the buffer header */
    444 				pBufHdr->pMarkData =
    445 				    ((PROXY_MARK_DATA *)
    446 				    pMarkData)->pMarkDataActual;
    447 				pBufHdr->hMarkTargetComponent =
    448 				    ((PROXY_MARK_DATA *)
    449 				    pMarkData)->hComponentActual;
    450 				TIMM_OSAL_Free(pMarkData);
    451 			}
    452 			break;
    453 		}
    454 	}
    455 	PROXY_assert((count != pCompPrv->nTotalBuffers),
    456 	    OMX_ErrorBadParameter,
    457 	    "Received invalid-buffer header from OMX component");
    458 
    459 	KPI_OmxCompBufferEvent(KPI_BUFFER_FBD, hComponent, &(pCompPrv->tBufList[count]));
    460 
    461       EXIT:
    462 	if (eError == OMX_ErrorNone)
    463 	{
    464 		pCompPrv->tCBFunc.FillBufferDone(hComponent,
    465 		    pCompPrv->pILAppData, pBufHdr);
    466 	} else if (pCompPrv)
    467 	{
    468 		pCompPrv->tCBFunc.EventHandler(hComponent,
    469 		    pCompPrv->pILAppData, OMX_EventError, eError, 0, NULL);
    470 	}
    471 
    472 	DOMX_EXIT("eError: %d", eError);
    473 	return OMX_ErrorNone;
    474 }
    475 
    476 /* ===========================================================================*/
    477 /**
    478  * @name PROXY_EmptyThisBuffer()
    479  * @brief
    480  * @param void
    481  * @return OMX_ErrorNone = Successful
    482  * @sa TBD
    483  *
    484  */
    485 /* ===========================================================================*/
    486 OMX_ERRORTYPE PROXY_EmptyThisBuffer(OMX_HANDLETYPE hComponent,
    487     OMX_BUFFERHEADERTYPE * pBufferHdr)
    488 {
    489 	OMX_ERRORTYPE eError = OMX_ErrorNone, eCompReturn = OMX_ErrorNone;
    490 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
    491 	PROXY_COMPONENT_PRIVATE *pCompPrv;
    492 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
    493 	OMX_U32 count = 0;
    494 	OMX_COMPONENTTYPE *pMarkComp = NULL;
    495 	PROXY_COMPONENT_PRIVATE *pMarkCompPrv = NULL;
    496 	OMX_PTR pMarkData = NULL;
    497 	OMX_BOOL bFreeMarkIfError = OMX_FALSE;
    498 	OMX_BOOL bIsProxy = OMX_FALSE , bMapBuffer;
    499 
    500 	PROXY_require(pBufferHdr != NULL, OMX_ErrorBadParameter, NULL);
    501 	PROXY_require(hComp->pComponentPrivate != NULL, OMX_ErrorBadParameter,
    502 	    NULL);
    503 	PROXY_CHK_VERSION(pBufferHdr, OMX_BUFFERHEADERTYPE);
    504 
    505 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
    506 
    507 	DOMX_ENTER
    508 	    ("hComponent=%p, pCompPrv=%p, nFilledLen=%d, nOffset=%d, nFlags=%08x",
    509 	    hComponent, pCompPrv, pBufferHdr->nFilledLen,
    510 	    pBufferHdr->nOffset, pBufferHdr->nFlags);
    511 
    512 	/*First find the index of this buffer header to retrieve remote buffer header */
    513 	for (count = 0; count < pCompPrv->nTotalBuffers; count++)
    514 	{
    515 		if (pCompPrv->tBufList[count].pBufHeader == pBufferHdr)
    516 		{
    517 			DOMX_DEBUG("Buffer Index of Match %d ", count);
    518 			break;
    519 		}
    520 	}
    521 	PROXY_assert((count != pCompPrv->nTotalBuffers),
    522 	    OMX_ErrorBadParameter,
    523 	    "Could not find the remote header in buffer list");
    524 
    525 	if (pBufferHdr->hMarkTargetComponent != NULL)
    526 	{
    527 		pMarkComp =
    528 		    (OMX_COMPONENTTYPE *) (pBufferHdr->hMarkTargetComponent);
    529 		/* Check is mark comp is proxy */
    530 		eError = _RPC_IsProxyComponent(pMarkComp, &bIsProxy);
    531 		PROXY_assert(eError == OMX_ErrorNone, eError, "");
    532 
    533 		/*Replacing original mark data with proxy specific structure */
    534 		pMarkData = pBufferHdr->pMarkData;
    535 		pBufferHdr->pMarkData =
    536 		    TIMM_OSAL_Malloc(sizeof(PROXY_MARK_DATA), TIMM_OSAL_TRUE,
    537 		    0, TIMMOSAL_MEM_SEGMENT_INT);
    538 		PROXY_assert(pBufferHdr->pMarkData != NULL,
    539 		    OMX_ErrorInsufficientResources, "Malloc failed");
    540 		bFreeMarkIfError = OMX_TRUE;
    541 		((PROXY_MARK_DATA *) (pBufferHdr->
    542 			pMarkData))->hComponentActual = pMarkComp;
    543 		((PROXY_MARK_DATA *) (pBufferHdr->
    544 			pMarkData))->pMarkDataActual = pMarkData;
    545 
    546 		/* If proxy comp then replace hMarkTargetComponent with remote
    547 		   handle */
    548 		if (bIsProxy)
    549 		{
    550 			pMarkCompPrv = pMarkComp->pComponentPrivate;
    551 			PROXY_assert(pMarkCompPrv != NULL,
    552 			    OMX_ErrorBadParameter, NULL);
    553 
    554 			/* Replacing with remote component handle */
    555 			pBufferHdr->hMarkTargetComponent =
    556 			    ((RPC_OMX_CONTEXT *) pMarkCompPrv->hRemoteComp)->
    557 			    hActualRemoteCompHandle;
    558 		}
    559 	}
    560 
    561 	bMapBuffer =
    562 		pCompPrv->proxyPortBuffers[pBufferHdr->nInputPortIndex].proxyBufferType ==
    563 			EncoderMetadataPointers;
    564 
    565 	KPI_OmxCompBufferEvent(KPI_BUFFER_ETB, hComponent, &(pCompPrv->tBufList[count]));
    566 
    567 	eRPCError =
    568 	    RPC_EmptyThisBuffer(pCompPrv->hRemoteComp, pBufferHdr,
    569 	    pCompPrv->tBufList[count].pBufHeaderRemote, &eCompReturn,bMapBuffer);
    570 
    571 	PROXY_checkRpcError();
    572 
    573       EXIT:
    574 	/*If ETB is about to return an error then this means that buffer has not
    575 	   been accepted by the component. Thus the allocated mark data will be
    576 	   lost so free it here. Also replace original mark data in the header */
    577 	if ((eError != OMX_ErrorNone) && bFreeMarkIfError)
    578 	{
    579 		pBufferHdr->hMarkTargetComponent =
    580 		    ((PROXY_MARK_DATA *) (pBufferHdr->
    581 			pMarkData))->hComponentActual;
    582 		pMarkData =
    583 		    ((PROXY_MARK_DATA *) (pBufferHdr->
    584 			pMarkData))->pMarkDataActual;
    585 		TIMM_OSAL_Free(pBufferHdr->pMarkData);
    586 		pBufferHdr->pMarkData = pMarkData;
    587 	}
    588 
    589 	DOMX_EXIT("eError: %d", eError);
    590 	return eError;
    591 }
    592 
    593 
    594 /* ===========================================================================*/
    595 /**
    596  * @name PROXY_FillThisBuffer()
    597  * @brief
    598  * @param void
    599  * @return OMX_ErrorNone = Successful
    600  * @sa TBD
    601  *
    602  */
    603 /* ===========================================================================*/
    604 OMX_ERRORTYPE PROXY_FillThisBuffer(OMX_HANDLETYPE hComponent,
    605     OMX_BUFFERHEADERTYPE * pBufferHdr)
    606 {
    607 	OMX_ERRORTYPE eError = OMX_ErrorNone, eCompReturn = OMX_ErrorNone;
    608 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
    609 	PROXY_COMPONENT_PRIVATE *pCompPrv;
    610 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
    611 	OMX_U32 count = 0;
    612 
    613 	PROXY_require(pBufferHdr != NULL, OMX_ErrorBadParameter, NULL);
    614 	PROXY_require(hComp->pComponentPrivate != NULL, OMX_ErrorBadParameter,
    615 	    NULL);
    616 	PROXY_CHK_VERSION(pBufferHdr, OMX_BUFFERHEADERTYPE);
    617 
    618 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
    619 
    620 	DOMX_ENTER
    621 	    ("hComponent = %p, pCompPrv = %p, nFilledLen = %d, nOffset = %d, nFlags = %08x",
    622 	    hComponent, pCompPrv, pBufferHdr->nFilledLen,
    623 	    pBufferHdr->nOffset, pBufferHdr->nFlags);
    624 
    625 	/*First find the index of this buffer header to retrieve remote buffer header */
    626 	for (count = 0; count < pCompPrv->nTotalBuffers; count++)
    627 	{
    628 		if (pCompPrv->tBufList[count].pBufHeader == pBufferHdr)
    629 		{
    630 			DOMX_DEBUG("Buffer Index of Match %d ", count);
    631 			break;
    632 		}
    633 	}
    634 	PROXY_assert((count != pCompPrv->nTotalBuffers),
    635 	    OMX_ErrorBadParameter,
    636 	    "Could not find the remote header in buffer list");
    637 
    638 	KPI_OmxCompBufferEvent(KPI_BUFFER_FTB, hComponent, &(pCompPrv->tBufList[count]));
    639 
    640 	eRPCError = RPC_FillThisBuffer(pCompPrv->hRemoteComp, pBufferHdr,
    641 	    pCompPrv->tBufList[count].pBufHeaderRemote, &eCompReturn);
    642 
    643 	PROXY_checkRpcError();
    644 
    645       EXIT:
    646 	DOMX_EXIT("eError: %d", eError);
    647 	return eError;
    648 }
    649 
    650 
    651 /* ===========================================================================*/
    652 /**
    653  * @name PROXY_AllocateBuffer()
    654  * @brief
    655  * @param void
    656  * @return OMX_ErrorNone = Successful
    657  * @sa TBD
    658  *
    659  */
    660 /* ===========================================================================*/
    661 OMX_ERRORTYPE PROXY_AllocateBuffer(OMX_IN OMX_HANDLETYPE hComponent,
    662     OMX_INOUT OMX_BUFFERHEADERTYPE ** ppBufferHdr,
    663     OMX_IN OMX_U32 nPortIndex,
    664     OMX_IN OMX_PTR pAppPrivate, OMX_IN OMX_U32 nSizeBytes)
    665 {
    666 	OMX_ERRORTYPE eError = OMX_ErrorNone;
    667 	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
    668 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
    669 	OMX_U32 currentBuffer = 0, i = 0;
    670 	OMX_BOOL bSlotFound = OMX_FALSE;
    671 #ifdef USE_ION
    672 	struct ion_handle *handle = NULL;
    673 	OMX_PTR pIonMappedBuffer = NULL;
    674 #endif
    675 
    676 #ifdef ALLOCATE_TILER_BUFFER_IN_PROXY
    677 	// Do the tiler allocations in Proxy and call use buffers on Ducati.
    678 
    679 	//Round Off the size to allocate and map to next page boundary.
    680 	OMX_U32 nSize = (nSizeBytes + LINUX_PAGE_SIZE - 1) & ~(LINUX_PAGE_SIZE - 1);
    681 	OMX_U32 nStride = 0;
    682 	OMX_U8* pMemptr = NULL;
    683 	OMX_CONFIG_RECTTYPE tParamRect;
    684 	OMX_PARAM_PORTDEFINITIONTYPE tParamPortDef;
    685 
    686 	PROXY_require((hComp->pComponentPrivate != NULL),
    687 	    OMX_ErrorBadParameter, NULL);
    688 	PROXY_require(ppBufferHdr != NULL, OMX_ErrorBadParameter,
    689 	    "Pointer to buffer header is NULL");
    690 
    691 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
    692 
    693 	DOMX_ENTER
    694 	    ("hComponent = %p, pCompPrv = %p, nPortIndex = %p, pAppPrivate = %p, nSizeBytes = %d",
    695 	    hComponent, pCompPrv, nPortIndex, pAppPrivate, nSizeBytes);
    696 
    697 	/*Pick up 1st empty slot */
    698 	/*The same empty spot will be picked up by the subsequent
    699 	Use buffer call to fill in the corresponding buffer
    700 	Buffer header in the list */
    701 
    702 	bSlotFound = OMX_FALSE;
    703 	for (i = 0; i < pCompPrv->nTotalBuffers; i++)
    704 	{
    705 		if (pCompPrv->tBufList[i].pBufHeader == NULL)
    706 		{
    707 			currentBuffer = i;
    708 			bSlotFound = OMX_TRUE;
    709 			break;
    710 		}
    711 	}
    712 
    713 	if (bSlotFound == OMX_FALSE)
    714 	{
    715 		currentBuffer = pCompPrv->nTotalBuffers;
    716 	}
    717 
    718 	/*To find whether buffer is 2D or 1D */
    719 	eError =
    720 	    RPC_UTIL_GetStride(pCompPrv->hRemoteComp, nPortIndex, &nStride);
    721 	PROXY_assert(eError == OMX_ErrorNone, eError,
    722 	    "Failed to get stride of component");
    723 
    724 	if (nStride == LINUX_PAGE_SIZE && \
    725 			pCompPrv->proxyPortBuffers[nPortIndex].proxyBufferType != EncoderMetadataPointers) //Allocate 2D buffer
    726 	{
    727 #if USE_ION
    728 		DOMX_ERROR ("Tiler 2d port buffers not implemented");
    729 		eError = OMX_ErrorNotImplemented;
    730 		goto EXIT;
    731 #endif
    732 	}
    733 #ifdef USE_ION
    734 	else if (pCompPrv->bUseIon == OMX_TRUE)
    735 	{
    736 		eError = PROXY_AllocateBufferIonCarveout(pCompPrv, nSize, &handle);
    737 		pCompPrv->tBufList[currentBuffer].pYBuffer = handle;
    738 		if (pCompPrv->bMapIonBuffers == OMX_TRUE)
    739 		{
    740 			DOMX_DEBUG("before mapping, handle = %x, nSize = %d",handle,nSize);
    741 			if (ion_map(pCompPrv->ion_fd, handle, nSize, PROT_READ | PROT_WRITE, MAP_SHARED, 0,
    742 		                &pIonMappedBuffer, &(pCompPrv->tBufList[currentBuffer].mmap_fd)) < 0)
    743 			{
    744 				DOMX_ERROR("userspace mapping of ION buffers returned error");
    745 				eError = OMX_ErrorInsufficientResources;
    746 				goto EXIT;
    747 			}
    748 		} else {
    749 			if (ion_share(pCompPrv->ion_fd, handle, &(pCompPrv->tBufList[currentBuffer].mmap_fd)) < 0) {
    750 				DOMX_ERROR("ion_share failed !!! \n");
    751 				goto EXIT;
    752 			} else {
    753 				DOMX_DEBUG("ion_share success pMemptr: 0x%x \n", pCompPrv->tBufList[currentBuffer].mmap_fd);
    754 			}
    755 		}
    756 		pMemptr = pCompPrv->tBufList[currentBuffer].mmap_fd;
    757 		DOMX_DEBUG ("Ion handle recieved = %x",handle);
    758 		if (eError != OMX_ErrorNone)
    759 			goto EXIT;
    760 	}
    761 #endif
    762 
    763 	/*No need to increment Allocated buffers here.
    764 	It will be done in the subsequent use buffer call below*/
    765 	eError = PROXY_UseBuffer(hComponent, ppBufferHdr, nPortIndex, pAppPrivate, nSize, pMemptr);
    766 
    767 	if(eError != OMX_ErrorNone) {
    768 		DOMX_ERROR("PROXY_UseBuffer in PROXY_AllocateBuffer failed with error %d (0x%08x)", eError, eError);
    769 #ifdef USE_ION
    770 		ion_free(pCompPrv->ion_fd,
    771 		         (struct ion_handle *)pCompPrv->tBufList[currentBuffer].pYBuffer);
    772 		close(pCompPrv->tBufList[currentBuffer].mmap_fd);
    773 #endif
    774 		goto EXIT;
    775 	}
    776 	else {
    777 #ifndef USE_ION
    778 		pCompPrv->tBufList[currentBuffer].pYBuffer = pMemptr;
    779 #endif
    780 	}
    781 
    782 #ifdef USE_ION
    783 	if (pCompPrv->bUseIon == OMX_TRUE && pCompPrv->bMapIonBuffers == OMX_TRUE)
    784 	{
    785 		DOMX_DEBUG("before mapping, handle = %x, nSize = %d",handle,nSize);
    786 		(*ppBufferHdr)->pBuffer = pIonMappedBuffer;
    787 	} else {
    788 		(*ppBufferHdr)->pBuffer = (OMX_U8 *)handle;
    789 	}
    790 #endif
    791 
    792 #else
    793 	//This code is the un-changed version of original implementation.
    794 	OMX_BUFFERHEADERTYPE *pBufferHeader = NULL;
    795 	OMX_U32 pBufHeaderRemote = 0;
    796 	OMX_U32 currentBuffer = 0, i = 0;
    797 	OMX_U8 *pBuffer = NULL;
    798 	OMX_TI_PLATFORMPRIVATE *pPlatformPrivate = NULL;
    799 	OMX_BOOL bSlotFound = OMX_FALSE;
    800 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
    801 	OMX_ERRORTYPE eCompReturn = OMX_ErrorNone;
    802 
    803 	PROXY_require((hComp->pComponentPrivate != NULL),
    804 	    OMX_ErrorBadParameter, NULL);
    805 	PROXY_require(ppBufferHdr != NULL, OMX_ErrorBadParameter,
    806 	    "Pointer to buffer header is NULL");
    807 
    808 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
    809 
    810 	DOMX_ENTER
    811 	    ("hComponent = %p, pCompPrv = %p, nPortIndex = %p, pAppPrivate = %p, nSizeBytes = %d",
    812 	    hComponent, pCompPrv, nPortIndex, pAppPrivate, nSizeBytes);
    813 
    814 	/*Pick up 1st empty slot */
    815 	for (i = 0; i < pCompPrv->nTotalBuffers; i++)
    816 	{
    817 		if (pCompPrv->tBufList[i].pBufHeader == 0)
    818 		{
    819 			currentBuffer = i;
    820 			bSlotFound = OMX_TRUE;
    821 			break;
    822 		}
    823 	}
    824 	if (!bSlotFound)
    825 	{
    826 		currentBuffer = pCompPrv->nTotalBuffers;
    827 	}
    828 
    829 	DOMX_DEBUG("In AB, no. of buffers = %d", pCompPrv->nTotalBuffers);
    830 	PROXY_assert((pCompPrv->nTotalBuffers < MAX_NUM_PROXY_BUFFERS),
    831 	    OMX_ErrorInsufficientResources,
    832 	    "Proxy cannot handle more than MAX buffers");
    833 
    834 	//Allocating Local bufferheader to be maintained locally within proxy
    835 	pBufferHeader =
    836 	    (OMX_BUFFERHEADERTYPE *)
    837 	    TIMM_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE), TIMM_OSAL_TRUE, 0,
    838 	    TIMMOSAL_MEM_SEGMENT_INT);
    839 	PROXY_assert((pBufferHeader != NULL), OMX_ErrorInsufficientResources,
    840 	    "Allocation of Buffer Header structure failed");
    841 
    842 	pPlatformPrivate =
    843 	    (OMX_TI_PLATFORMPRIVATE *)
    844 	    TIMM_OSAL_Malloc(sizeof(OMX_TI_PLATFORMPRIVATE), TIMM_OSAL_TRUE,
    845 	    0, TIMMOSAL_MEM_SEGMENT_INT);
    846 	PROXY_assert(pPlatformPrivate != NULL, OMX_ErrorInsufficientResources,
    847 	    "Allocation of platform private structure failed");
    848 	pBufferHeader->pPlatformPrivate = pPlatformPrivate;
    849 
    850 	DOMX_DEBUG(" Calling RPC ");
    851 
    852 	eRPCError =
    853 	    RPC_AllocateBuffer(pCompPrv->hRemoteComp, &pBufferHeader,
    854 	    nPortIndex, &pBufHeaderRemote, pAppPrivate, nSizeBytes,
    855 	    &eCompReturn);
    856 
    857 	PROXY_checkRpcError();
    858 
    859 	DOMX_DEBUG("Allocate Buffer Successful");
    860 	DOMX_DEBUG("Value of pBufHeaderRemote: %p   LocalBufferHdr :%p",
    861 	    pBufHeaderRemote, pBufferHeader);
    862 
    863 	pCompPrv->tBufList[currentBuffer].pBufHeader = pBufferHeader;
    864 	pCompPrv->tBufList[currentBuffer].pBufHeaderRemote = pBufHeaderRemote;
    865 
    866 
    867 	//keeping track of number of Buffers
    868 	pCompPrv->nAllocatedBuffers++;
    869 
    870 	if (pCompPrv->nTotalBuffers < pCompPrv->nAllocatedBuffers)
    871 	{
    872 		pCompPrv->nTotalBuffers = pCompPrv->nAllocatedBuffers;
    873 	}
    874 
    875 	*ppBufferHdr = pBufferHeader;
    876 
    877       EXIT:
    878 	if (eError != OMX_ErrorNone)
    879 	{
    880 		if (pPlatformPrivate)
    881 			TIMM_OSAL_Free(pPlatformPrivate);
    882 		if (pBufferHeader)
    883 			TIMM_OSAL_Free(pBufferHeader);
    884 	}
    885 	DOMX_EXIT("eError: %d", eError);
    886 	return eError;
    887 #endif //ALLOCATE_TILER_BUFFER_IN_PROXY
    888 
    889       EXIT:
    890 	DOMX_EXIT("eError: %d", eError);
    891 	return eError;
    892 }
    893 
    894 
    895 /* ===========================================================================*/
    896 /**
    897  * @name PROXY_UseBuffer()
    898  * @brief
    899  * @param void
    900  * @return OMX_ErrorNone = Successful
    901  * @sa TBD
    902  *
    903  */
    904 /* ===========================================================================*/
    905 static OMX_ERRORTYPE PROXY_UseBuffer(OMX_IN OMX_HANDLETYPE hComponent,
    906     OMX_INOUT OMX_BUFFERHEADERTYPE ** ppBufferHdr,
    907     OMX_IN OMX_U32 nPortIndex, OMX_IN OMX_PTR pAppPrivate,
    908     OMX_IN OMX_U32 nSizeBytes, OMX_IN OMX_U8 * pBuffer)
    909 {
    910 	OMX_ERRORTYPE eError = OMX_ErrorNone, eCompReturn = OMX_ErrorNone;
    911 	OMX_BUFFERHEADERTYPE *pBufferHeader = NULL;
    912 	OMX_U32 pBufHeaderRemote = 0;
    913 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
    914 	OMX_U32 currentBuffer = 0, i = 0, nStride = 0, nNumLines = 0;
    915 	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
    916 	OMX_TI_PLATFORMPRIVATE *pPlatformPrivate = NULL;
    917 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
    918 	OMX_BOOL bSlotFound = OMX_FALSE;
    919 	OMX_PTR pAuxBuf0 = pBuffer;
    920 	OMX_PTR pMappedMetaDataBuffer = NULL;
    921 	OMX_TI_PARAM_METADATABUFFERINFO tMetaDataBuffer;
    922 	OMX_U32 nBufferHeight = 0;
    923 	OMX_CONFIG_RECTTYPE tParamRect;
    924 	OMX_PARAM_PORTDEFINITIONTYPE tParamPortDef;
    925 
    926 #ifdef USE_ION
    927 	OMX_PTR pMetadataBuffer = NULL;
    928 #endif
    929 
    930 	PROXY_require((hComp->pComponentPrivate != NULL),
    931 	    OMX_ErrorBadParameter, NULL);
    932 	PROXY_require(pBuffer != NULL, OMX_ErrorBadParameter, "Pointer to buffer is NULL");
    933 	PROXY_require(ppBufferHdr != NULL, OMX_ErrorBadParameter,
    934 	    "Pointer to buffer header is NULL");
    935 
    936 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
    937 
    938 	DOMX_ENTER
    939 	    ("hComponent = %p, pCompPrv = %p, nPortIndex = %p, pAppPrivate = %p, nSizeBytes = %d, pBuffer = %p",
    940 	    hComponent, pCompPrv, nPortIndex, pAppPrivate, nSizeBytes,
    941 	    pBuffer);
    942 
    943 	/*Pick up 1st empty slot */
    944 	for (i = 0; i < pCompPrv->nTotalBuffers; i++)
    945 	{
    946 		if (pCompPrv->tBufList[i].pBufHeader == 0)
    947 		{
    948 			currentBuffer = i;
    949 			bSlotFound = OMX_TRUE;
    950 			break;
    951 		}
    952 	}
    953 	if (!bSlotFound)
    954 	{
    955 		currentBuffer = pCompPrv->nTotalBuffers;
    956 	}
    957 	DOMX_DEBUG("In UB, no. of buffers = %d", pCompPrv->nTotalBuffers);
    958 
    959 	PROXY_assert((pCompPrv->nTotalBuffers < MAX_NUM_PROXY_BUFFERS),
    960 	    OMX_ErrorInsufficientResources,
    961 	    "Proxy cannot handle more than MAX buffers");
    962 
    963 	//Allocating Local bufferheader to be maintained locally within proxy
    964 	pBufferHeader =
    965 	    (OMX_BUFFERHEADERTYPE *)
    966 	    TIMM_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE), TIMM_OSAL_TRUE, 0,
    967 	    TIMMOSAL_MEM_SEGMENT_INT);
    968 	PROXY_assert((pBufferHeader != NULL), OMX_ErrorInsufficientResources,
    969 	    "Allocation of Buffer Header structure failed");
    970 
    971 	pPlatformPrivate =
    972 	    (OMX_TI_PLATFORMPRIVATE *)
    973 	    TIMM_OSAL_Malloc(sizeof(OMX_TI_PLATFORMPRIVATE), TIMM_OSAL_TRUE,
    974 	    0, TIMMOSAL_MEM_SEGMENT_INT);
    975 	PROXY_assert(pPlatformPrivate != NULL, OMX_ErrorInsufficientResources,
    976 	    "Allocation of platform private structure failed");
    977 	TIMM_OSAL_Memset(pPlatformPrivate, 0, sizeof(OMX_TI_PLATFORMPRIVATE));
    978 
    979 	pBufferHeader->pPlatformPrivate = pPlatformPrivate;
    980 	((OMX_TI_PLATFORMPRIVATE *)pBufferHeader->pPlatformPrivate)->nSize = sizeof(OMX_TI_PLATFORMPRIVATE);
    981 
    982 #ifdef ENABLE_GRALLOC_BUFFERS
    983 
    984 	if(pCompPrv->proxyPortBuffers[nPortIndex].proxyBufferType == GrallocPointers)
    985 	{
    986 		//Extracting buffer pointer from the gralloc buffer
    987 		pAuxBuf0 = (OMX_U8 *)(((IMG_native_handle_t*)pBuffer)->fd[0]);
    988 	}
    989 #endif
    990 
    991 	DOMX_DEBUG("Preparing buffer to Remote Core...");
    992 	pBufferHeader->pBuffer = pBuffer;
    993 	/*To find whether buffer is 2D or 1D */
    994 	eError =
    995 	    RPC_UTIL_GetStride(pCompPrv->hRemoteComp, nPortIndex, &nStride);
    996 	PROXY_assert(eError == OMX_ErrorNone, eError,
    997 	    "Failed to get stride of component");
    998 	if (nStride == LINUX_PAGE_SIZE)
    999 	{
   1000 		// Change this to extract UV pointer from gralloc handle once new gralloc interface is available
   1001 		/*2D buffer, assume NV12 format */
   1002 		eError =
   1003 		    RPC_UTIL_GetNumLines(pCompPrv->hRemoteComp, nPortIndex,
   1004 		    &nNumLines);
   1005 		PROXY_assert(eError == OMX_ErrorNone, eError,
   1006 		    "Failed to get num of lines");
   1007 
   1008 		if(pCompPrv->proxyPortBuffers[nPortIndex].proxyBufferType == GrallocPointers)
   1009 		{
   1010 			((OMX_TI_PLATFORMPRIVATE *) pBufferHeader->pPlatformPrivate)->
   1011 				pAuxBuf1 = (OMX_U8 *)(((IMG_native_handle_t*)pBuffer)->fd[1]);
   1012 		}
   1013 
   1014 		if(pCompPrv->proxyPortBuffers[nPortIndex].proxyBufferType == EncoderMetadataPointers)
   1015 		{
   1016 			((OMX_TI_PLATFORMPRIVATE *) pBufferHeader->pPlatformPrivate)->
   1017 				pAuxBuf1 = NULL;
   1018 		}
   1019 		if(pCompPrv->proxyPortBuffers[nPortIndex].proxyBufferType == BufferDescriptorVirtual2D)
   1020 		{
   1021 			pAuxBuf0 = (OMX_U8 *)(((OMX_TI_BUFFERDESCRIPTOR_TYPE*)pBuffer)->pBuf[0]);
   1022 
   1023 			((OMX_TI_PLATFORMPRIVATE *) pBufferHeader->pPlatformPrivate)->
   1024 				pAuxBuf1 = (OMX_U8 *)(((OMX_TI_BUFFERDESCRIPTOR_TYPE*)pBuffer)->pBuf[1]);
   1025 		}
   1026 	}
   1027 
   1028 	/*Initializing Structure */
   1029 	tMetaDataBuffer.nSize = sizeof(OMX_TI_PARAM_METADATABUFFERINFO);
   1030 	tMetaDataBuffer.nVersion.s.nVersionMajor = OMX_VER_MAJOR;
   1031 	tMetaDataBuffer.nVersion.s.nVersionMinor = OMX_VER_MINOR;
   1032 	tMetaDataBuffer.nVersion.s.nRevision = 0x0;
   1033 	tMetaDataBuffer.nVersion.s.nStep = 0x0;
   1034 	tMetaDataBuffer.nPortIndex = nPortIndex;
   1035 	eError = PROXY_GetParameter(hComponent, (OMX_INDEXTYPE)OMX_TI_IndexParamMetaDataBufferInfo, (OMX_PTR)&tMetaDataBuffer);
   1036 	PROXY_assert(eError == OMX_ErrorNone, eError,
   1037 	    "Get Parameter for Metadata infor failed");
   1038 
   1039 	DOMX_DEBUG("Metadata size = %d",tMetaDataBuffer.nMetaDataSize);
   1040 
   1041 	if(tMetaDataBuffer.bIsMetaDataEnabledOnPort)
   1042 	{
   1043 #ifdef USE_ION
   1044 		((OMX_TI_PLATFORMPRIVATE *)pBufferHeader->pPlatformPrivate)->nMetaDataSize =
   1045 			(tMetaDataBuffer.nMetaDataSize + LINUX_PAGE_SIZE - 1) & ~(LINUX_PAGE_SIZE -1);
   1046 		eError = PROXY_AllocateBufferIonCarveout(pCompPrv, ((OMX_TI_PLATFORMPRIVATE *)pBufferHeader->pPlatformPrivate)->nMetaDataSize,
   1047 			(struct ion_handle **)(&(((OMX_TI_PLATFORMPRIVATE *)pBufferHeader->pPlatformPrivate)->pMetaDataBuffer)));
   1048 		pCompPrv->tBufList[currentBuffer].pMetaDataBuffer = ((OMX_TI_PLATFORMPRIVATE *)pBufferHeader->
   1049 			pPlatformPrivate)->pMetaDataBuffer;
   1050 		DOMX_DEBUG("Metadata buffer ion handle = %d",((OMX_TI_PLATFORMPRIVATE *)pBufferHeader->pPlatformPrivate)->pMetaDataBuffer);
   1051 		if (pCompPrv->bMapIonBuffers == OMX_TRUE) {
   1052 			if (ion_map(pCompPrv->ion_fd, pPlatformPrivate->pMetaDataBuffer,
   1053 				    pPlatformPrivate->nMetaDataSize,
   1054 				    PROT_READ | PROT_WRITE, MAP_SHARED, 0,
   1055 				    &pMetadataBuffer,
   1056 				    &(pCompPrv->tBufList[currentBuffer].mmap_fd_metadata_buff)) < 0)
   1057 			{
   1058 				DOMX_ERROR("userspace mapping of ION metadata buffers returned error");
   1059 				eError = OMX_ErrorInsufficientResources;
   1060 				goto EXIT;
   1061 			}
   1062 		}
   1063 #endif
   1064 	}
   1065 
   1066 #ifdef USE_ION
   1067 	{
   1068 		// Need to register buffers when using ion and rpmsg
   1069 		eRPCError = RPC_RegisterBuffer(pCompPrv->hRemoteComp, pAuxBuf0,
   1070 					   &pCompPrv->tBufList[currentBuffer].pRegisteredAufBux0,
   1071 					   &pCompPrv->tBufList[currentBuffer].pRegisteredAufBux1,
   1072 					   pCompPrv->proxyPortBuffers[nPortIndex].proxyBufferType);
   1073 		PROXY_checkRpcError();
   1074 		if (pCompPrv->tBufList[currentBuffer].pRegisteredAufBux0)
   1075 			pAuxBuf0 = pCompPrv->tBufList[currentBuffer].pRegisteredAufBux0;
   1076 		if (pCompPrv->tBufList[currentBuffer].pRegisteredAufBux1)
   1077 			pPlatformPrivate->pAuxBuf1 = pCompPrv->tBufList[currentBuffer].pRegisteredAufBux1;
   1078 
   1079 		if (pPlatformPrivate->pMetaDataBuffer != NULL)
   1080 		{
   1081 			int fd = -1;
   1082 			if (pCompPrv->bMapIonBuffers == OMX_TRUE) {
   1083 				fd = pCompPrv->tBufList[currentBuffer].mmap_fd_metadata_buff;
   1084 			} else {
   1085 				ion_share (pCompPrv->ion_fd, pPlatformPrivate->pMetaDataBuffer, &fd);
   1086 				pCompPrv->tBufList[currentBuffer].mmap_fd_metadata_buff = fd;
   1087 			}
   1088 			eRPCError = RPC_RegisterBuffer(pCompPrv->hRemoteComp, fd,
   1089 					   &pCompPrv->tBufList[currentBuffer].pRegisteredAufBux2, NULL, IONPointers);
   1090 			PROXY_checkRpcError();
   1091 			if (pCompPrv->tBufList[currentBuffer].pRegisteredAufBux2)
   1092 				pPlatformPrivate->pMetaDataBuffer = pCompPrv->tBufList[currentBuffer].pRegisteredAufBux2;
   1093 		}
   1094 	}
   1095 #endif
   1096 
   1097 	eRPCError = RPC_UseBuffer(pCompPrv->hRemoteComp, &pBufferHeader, nPortIndex,
   1098 		pAppPrivate, nSizeBytes, pAuxBuf0, &pBufHeaderRemote, &eCompReturn);
   1099 
   1100 	PROXY_checkRpcError();
   1101 
   1102 	DOMX_DEBUG("Use Buffer Successful");
   1103 	DOMX_DEBUG
   1104 	    ("Value of pBufHeaderRemote: %p LocalBufferHdr :%p, LocalBuffer :%p",
   1105 	    pBufHeaderRemote, pBufferHeader, pBufferHeader->pBuffer);
   1106 
   1107 #ifdef USE_ION
   1108 	if (pCompPrv->bUseIon == OMX_TRUE && pCompPrv->bMapIonBuffers == OMX_TRUE && tMetaDataBuffer.bIsMetaDataEnabledOnPort)
   1109 	{
   1110 		((OMX_TI_PLATFORMPRIVATE *)pBufferHeader->pPlatformPrivate)->pMetaDataBuffer = pMetadataBuffer;
   1111 		//ion_free(pCompPrv->ion_fd, handleToMap);
   1112 		memset(((OMX_TI_PLATFORMPRIVATE *)pBufferHeader->pPlatformPrivate)->pMetaDataBuffer,
   1113 			0x0, tMetaDataBuffer.nMetaDataSize);
   1114 	}
   1115 #endif
   1116 
   1117 	//Storing details of pBufferHeader/Mapped/Actual buffer address locally.
   1118 	pCompPrv->tBufList[currentBuffer].pBufHeader = pBufferHeader;
   1119 	pCompPrv->tBufList[currentBuffer].pBufHeaderRemote = pBufHeaderRemote;
   1120 
   1121 	//keeping track of number of Buffers
   1122 	pCompPrv->nAllocatedBuffers++;
   1123 	if (pCompPrv->nTotalBuffers < pCompPrv->nAllocatedBuffers)
   1124 		pCompPrv->nTotalBuffers = pCompPrv->nAllocatedBuffers;
   1125 
   1126 	DOMX_DEBUG("Updating no. of buffer to %d", pCompPrv->nTotalBuffers);
   1127 
   1128 	*ppBufferHdr = pBufferHeader;
   1129 
   1130       EXIT:
   1131 	if (eError != OMX_ErrorNone)
   1132 	{
   1133 		if (pPlatformPrivate)
   1134 			TIMM_OSAL_Free(pPlatformPrivate);
   1135 		if (pBufferHeader)
   1136 			TIMM_OSAL_Free(pBufferHeader);
   1137 	}
   1138 	DOMX_EXIT("eError: %d", eError);
   1139 	return eError;
   1140 }
   1141 
   1142 /* ===========================================================================*/
   1143 /**
   1144  * @name PROXY_FreeBuffer()
   1145  * @brief
   1146  * @param void
   1147  * @return OMX_ErrorNone = Successful
   1148  * @sa TBD
   1149  *
   1150  */
   1151 /* ===========================================================================*/
   1152 OMX_ERRORTYPE PROXY_FreeBuffer(OMX_IN OMX_HANDLETYPE hComponent,
   1153     OMX_IN OMX_U32 nPortIndex, OMX_IN OMX_BUFFERHEADERTYPE * pBufferHdr)
   1154 {
   1155 	OMX_ERRORTYPE eError = OMX_ErrorNone, eCompReturn = OMX_ErrorNone;
   1156 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
   1157 	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
   1158 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone, eTmpRPCError =
   1159 	    RPC_OMX_ErrorNone;
   1160 	OMX_U32 count = 0, nStride = 0;
   1161 	OMX_U32 pBuffer = 0;
   1162 	OMX_PTR pMetaDataBuffer = NULL;
   1163 	OMX_PTR pAuxBuf0 = NULL;
   1164 	OMX_TI_PLATFORMPRIVATE * pPlatformPrivate = NULL;
   1165 
   1166 	PROXY_require(pBufferHdr != NULL, OMX_ErrorBadParameter, NULL);
   1167 	PROXY_require(hComp->pComponentPrivate != NULL, OMX_ErrorBadParameter,
   1168 	    NULL);
   1169 	PROXY_CHK_VERSION(pBufferHdr, OMX_BUFFERHEADERTYPE);
   1170 
   1171 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
   1172 
   1173 	DOMX_ENTER
   1174 	    ("hComponent = %p, pCompPrv = %p, nPortIndex = %p, pBufferHdr = %p, pBuffer = %p",
   1175 	    hComponent, pCompPrv, nPortIndex, pBufferHdr,
   1176 	    pBufferHdr->pBuffer);
   1177 
   1178 	for (count = 0; count < pCompPrv->nTotalBuffers; count++)
   1179 	{
   1180 		if (pCompPrv->tBufList[count].pBufHeader == pBufferHdr)
   1181 		{
   1182 			DOMX_DEBUG("Buffer Index of Match %d", count);
   1183 			break;
   1184 		}
   1185 	}
   1186 	PROXY_assert((count != pCompPrv->nTotalBuffers),
   1187 	    OMX_ErrorBadParameter,
   1188 	    "Could not find the mapped address in component private buffer list");
   1189 
   1190 	pBuffer = (OMX_U32)pBufferHdr->pBuffer;
   1191     pAuxBuf0 = (OMX_PTR) pBuffer;
   1192 
   1193 #ifdef ENABLE_GRALLOC_BUFFERS
   1194 	if (pCompPrv->proxyPortBuffers[nPortIndex].proxyBufferType == GrallocPointers)
   1195 	{
   1196 		//Extracting buffer pointer from the gralloc buffer
   1197 		pAuxBuf0 = (OMX_U8 *)(((IMG_native_handle_t*)pBuffer)->fd[0]);
   1198 	}
   1199 #endif
   1200 
   1201 	/*To find whether buffer is 2D or 1D */
   1202 	/*Not having asserts from this point since even if error occurs during
   1203 	   unmapping/freeing, still trying to clean up as much as possible */
   1204 	eError =
   1205 	    RPC_UTIL_GetStride(pCompPrv->hRemoteComp, nPortIndex, &nStride);
   1206 	if (eError == OMX_ErrorNone && nStride == LINUX_PAGE_SIZE)
   1207 	{
   1208 		if (pCompPrv->proxyPortBuffers[nPortIndex].proxyBufferType == BufferDescriptorVirtual2D)
   1209 		{
   1210 			pAuxBuf0 = (OMX_U8 *)(((OMX_TI_BUFFERDESCRIPTOR_TYPE*)pBuffer)->pBuf[0]);
   1211 		}
   1212 	}
   1213 
   1214 	/*Not having asserts from this point since even if error occurs during
   1215 	   unmapping/freeing, still trying to clean up as much as possible */
   1216 
   1217 	if (pCompPrv->tBufList[count].pRegisteredAufBux0 != NULL)
   1218 		pAuxBuf0 = pCompPrv->tBufList[count].pRegisteredAufBux0;
   1219 
   1220 	eRPCError =
   1221 	    RPC_FreeBuffer(pCompPrv->hRemoteComp, nPortIndex,
   1222 	    pCompPrv->tBufList[count].pBufHeaderRemote, (OMX_U32) pAuxBuf0,
   1223 	    &eCompReturn);
   1224 
   1225 	if (eRPCError != RPC_OMX_ErrorNone)
   1226 		eTmpRPCError = eRPCError;
   1227 
   1228 	pPlatformPrivate = (OMX_TI_PLATFORMPRIVATE *)(pCompPrv->tBufList[count].pBufHeader)->
   1229 			pPlatformPrivate;
   1230 
   1231 	if (pCompPrv->tBufList[count].pBufHeader)
   1232 	{
   1233 #ifdef ALLOCATE_TILER_BUFFER_IN_PROXY
   1234 #ifdef USE_ION
   1235 		if(pCompPrv->tBufList[count].pYBuffer)
   1236 		{
   1237         		if (pCompPrv->bUseIon == OMX_TRUE)
   1238 			{
   1239 				if(pCompPrv->bMapIonBuffers == OMX_TRUE && pBufferHdr->pBuffer)
   1240 				{
   1241 	                                munmap(pBufferHdr->pBuffer, pBufferHdr->nAllocLen);
   1242         				close(pCompPrv->tBufList[count].mmap_fd);
   1243 				}
   1244 				ion_free(pCompPrv->ion_fd, pCompPrv->tBufList[count].pYBuffer);
   1245 				pCompPrv->tBufList[count].pYBuffer = NULL;
   1246 			}
   1247 		}
   1248 #endif
   1249 #endif
   1250 		pMetaDataBuffer = pPlatformPrivate->pMetaDataBuffer;
   1251 		if (pMetaDataBuffer)
   1252 		{
   1253 #ifdef USE_ION
   1254         		if (pCompPrv->bUseIon == OMX_TRUE)
   1255 			{
   1256 				if(pCompPrv->bMapIonBuffers == OMX_TRUE)
   1257 				{
   1258 					munmap(pMetaDataBuffer, pPlatformPrivate->nMetaDataSize);
   1259 				}
   1260 				close(pCompPrv->tBufList[count].mmap_fd_metadata_buff);
   1261 				ion_free(pCompPrv->ion_fd, pCompPrv->tBufList[count].pMetaDataBuffer);
   1262 				pPlatformPrivate->pMetaDataBuffer = NULL;
   1263 			}
   1264 #endif
   1265 		}
   1266 
   1267 #ifdef USE_ION
   1268 	{
   1269 		// Need to unregister buffers when using ion and rpmsg
   1270 		if (pCompPrv->tBufList[count].pRegisteredAufBux0 != NULL)
   1271 		{
   1272 			eTmpRPCError = RPC_UnRegisterBuffer(pCompPrv->hRemoteComp,
   1273 								pCompPrv->tBufList[count].pRegisteredAufBux0);
   1274 			if (eTmpRPCError != RPC_OMX_ErrorNone) {
   1275 				eRPCError = eTmpRPCError;
   1276 			}
   1277 		}
   1278 
   1279 		if (pCompPrv->tBufList[count].pRegisteredAufBux1 != NULL)
   1280 		{
   1281 			eTmpRPCError = RPC_UnRegisterBuffer(pCompPrv->hRemoteComp,
   1282 								pCompPrv->tBufList[count].pRegisteredAufBux1);
   1283 			if (eTmpRPCError != RPC_OMX_ErrorNone) {
   1284 				eRPCError = eTmpRPCError;
   1285 			}
   1286 		}
   1287 		if (pCompPrv->tBufList[count].pRegisteredAufBux2 != NULL)
   1288 		{
   1289 			eTmpRPCError = RPC_UnRegisterBuffer(pCompPrv->hRemoteComp,
   1290 								pCompPrv->tBufList[count].pRegisteredAufBux2);
   1291 			if (eTmpRPCError != RPC_OMX_ErrorNone) {
   1292 				eRPCError = eTmpRPCError;
   1293 			}
   1294 		}
   1295 	}
   1296 #endif
   1297 		if (pCompPrv->tBufList[count].pBufHeader->pPlatformPrivate)
   1298 		{
   1299 			TIMM_OSAL_Free(pCompPrv->tBufList[count].pBufHeader->
   1300 			    pPlatformPrivate);
   1301 		}
   1302 		TIMM_OSAL_Free(pCompPrv->tBufList[count].pBufHeader);
   1303 		TIMM_OSAL_Memset(&(pCompPrv->tBufList[count]), 0,
   1304 		    sizeof(PROXY_BUFFER_INFO));
   1305 	}
   1306 	pCompPrv->nAllocatedBuffers--;
   1307 
   1308 	PROXY_checkRpcError();
   1309 
   1310       EXIT:
   1311 	DOMX_EXIT("eError: %d", eError);
   1312 	return eError;
   1313 }
   1314 
   1315 
   1316 /* ===========================================================================*/
   1317 /**
   1318  * @name PROXY_SetParameter()
   1319  * @brief
   1320  * @param void
   1321  * @return OMX_ErrorNone = Successful
   1322  * @sa TBD
   1323  *
   1324  */
   1325 /* ===========================================================================*/
   1326 OMX_ERRORTYPE __PROXY_SetParameter(OMX_IN OMX_HANDLETYPE hComponent,
   1327 	OMX_IN OMX_INDEXTYPE nParamIndex, OMX_IN OMX_PTR pParamStruct,
   1328 	OMX_PTR pLocBufNeedMap, OMX_U32 nNumOfLocalBuf)
   1329 {
   1330 	OMX_ERRORTYPE eError = OMX_ErrorNone, eCompReturn = OMX_ErrorNone;
   1331 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
   1332 	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
   1333 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
   1334 	OMX_TI_PARAM_USEBUFFERDESCRIPTOR *ptBufDescParam = NULL;
   1335 #ifdef ENABLE_GRALLOC_BUFFERS
   1336 	OMX_TI_PARAMUSENATIVEBUFFER *pParamNativeBuffer = NULL;
   1337 #endif
   1338 #ifdef USE_ION
   1339 	OMX_PTR *pAuxBuf = pLocBufNeedMap;
   1340 	OMX_PTR pRegistered = NULL;
   1341 #endif
   1342 
   1343 	PROXY_require((pParamStruct != NULL), OMX_ErrorBadParameter, NULL);
   1344 	PROXY_require((hComp->pComponentPrivate != NULL),
   1345 	    OMX_ErrorBadParameter, NULL);
   1346 
   1347 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
   1348 
   1349 	DOMX_ENTER
   1350 		("hComponent = %p, pCompPrv = %p, nParamIndex = %d, pParamStruct = %p",
   1351 		hComponent, pCompPrv, nParamIndex, pParamStruct);
   1352 
   1353 	switch(nParamIndex)
   1354 	{
   1355 #ifdef ENABLE_GRALLOC_BUFFERS
   1356 		case OMX_TI_IndexUseNativeBuffers:
   1357 		{
   1358 			//Add check version.
   1359 			pParamNativeBuffer = (OMX_TI_PARAMUSENATIVEBUFFER* )pParamStruct;
   1360 			if(pParamNativeBuffer->bEnable == OMX_TRUE)
   1361 			{
   1362 				pCompPrv->proxyPortBuffers[pParamNativeBuffer->nPortIndex].proxyBufferType = GrallocPointers;
   1363 				pCompPrv->proxyPortBuffers[pParamNativeBuffer->nPortIndex].IsBuffer2D = OMX_TRUE;
   1364 			} else
   1365 			{
   1366 				/* Reset to defaults */
   1367 				pCompPrv->proxyPortBuffers[pParamNativeBuffer->nPortIndex].proxyBufferType = VirtualPointers;
   1368 				pCompPrv->proxyPortBuffers[pParamNativeBuffer->nPortIndex].IsBuffer2D = OMX_FALSE;
   1369 			}
   1370 
   1371 			break;
   1372 		}
   1373 #endif
   1374 		case OMX_TI_IndexUseBufferDescriptor:
   1375 		     ptBufDescParam = (OMX_TI_PARAM_USEBUFFERDESCRIPTOR *) pParamStruct;
   1376 		     if(ptBufDescParam->bEnabled == OMX_TRUE)
   1377 		     {
   1378 			     if(ptBufDescParam->eBufferType == OMX_TI_BufferTypeVirtual2D)
   1379 			     {
   1380 			         pCompPrv->proxyPortBuffers[ptBufDescParam->nPortIndex].proxyBufferType = BufferDescriptorVirtual2D;
   1381 			         pCompPrv->proxyPortBuffers[ptBufDescParam->nPortIndex].IsBuffer2D = OMX_TRUE;
   1382 		             }
   1383 		     }
   1384 		     else if(ptBufDescParam->bEnabled == OMX_FALSE)
   1385 		     {
   1386 			     /* Reset to defaults*/
   1387 			     pCompPrv->proxyPortBuffers[ptBufDescParam->nPortIndex].proxyBufferType = VirtualPointers;
   1388 			     pCompPrv->proxyPortBuffers[ptBufDescParam->nPortIndex].IsBuffer2D = OMX_FALSE;
   1389 		     }
   1390 			eRPCError =
   1391 				RPC_SetParameter(pCompPrv->hRemoteComp, nParamIndex, pParamStruct,
   1392 					pLocBufNeedMap, nNumOfLocalBuf, &eCompReturn);
   1393 		     break;
   1394 		default:
   1395 		{
   1396 #ifdef USE_ION
   1397 			if (pAuxBuf != NULL) {
   1398 				int fd = *((int*)pAuxBuf);
   1399 				if (fd > -1) {
   1400 					eRPCError = RPC_RegisterBuffer(pCompPrv->hRemoteComp, *((int*)pAuxBuf),
   1401 							   &pRegistered, NULL, IONPointers);
   1402 					PROXY_checkRpcError();
   1403 					if (pRegistered)
   1404 						*pAuxBuf = pRegistered;
   1405 				}
   1406 			}
   1407 #endif
   1408 			eRPCError =
   1409 				RPC_SetParameter(pCompPrv->hRemoteComp, nParamIndex, pParamStruct,
   1410 					pLocBufNeedMap, nNumOfLocalBuf, &eCompReturn);
   1411 #ifdef USE_ION
   1412 			PROXY_checkRpcError();
   1413 			if (pRegistered != NULL) {
   1414 				eRPCError = RPC_UnRegisterBuffer(pCompPrv->hRemoteComp, pRegistered);
   1415 				PROXY_checkRpcError();
   1416 			}
   1417 #endif
   1418 		}
   1419 	}
   1420 
   1421 	PROXY_checkRpcError();
   1422 
   1423  EXIT:
   1424 	DOMX_EXIT("eError: %d", eError);
   1425 	return eError;
   1426 }
   1427 
   1428 /* ===========================================================================*/
   1429 /**
   1430  * @name PROXY_SetParameter()
   1431  * @brief
   1432  * @param void
   1433  * @return OMX_ErrorNone = Successful
   1434  * @sa TBD
   1435  *
   1436  */
   1437 /* ===========================================================================*/
   1438 OMX_ERRORTYPE PROXY_SetParameter(OMX_IN OMX_HANDLETYPE hComponent,
   1439     OMX_IN OMX_INDEXTYPE nParamIndex, OMX_IN OMX_PTR pParamStruct)
   1440 {
   1441 	return __PROXY_SetParameter(hComponent, nParamIndex, pParamStruct, NULL, 0);
   1442 }
   1443 
   1444 
   1445 /* ===========================================================================*/
   1446 /**
   1447  * @name __PROXY_GetParameter()
   1448  * @brief
   1449  * @param void
   1450  * @return OMX_ErrorNone = Successful
   1451  * @sa TBD
   1452  *
   1453  */
   1454 /* ===========================================================================*/
   1455 OMX_ERRORTYPE __PROXY_GetParameter(OMX_IN OMX_HANDLETYPE hComponent,
   1456 		OMX_IN OMX_INDEXTYPE nParamIndex, OMX_INOUT OMX_PTR pParamStruct,
   1457 		OMX_PTR pLocBufNeedMap)
   1458 {
   1459 	OMX_ERRORTYPE eError = OMX_ErrorNone, eCompReturn = OMX_ErrorNone;
   1460 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
   1461 	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
   1462 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
   1463 	OMX_TI_PARAM_USEBUFFERDESCRIPTOR *ptBufDescParam = NULL;
   1464 #ifdef USE_ION
   1465 	OMX_PTR *pAuxBuf = pLocBufNeedMap;
   1466 	OMX_PTR pRegistered = NULL;
   1467 #endif
   1468 
   1469 	PROXY_require((pParamStruct != NULL), OMX_ErrorBadParameter, NULL);
   1470 	PROXY_assert((hComp->pComponentPrivate != NULL),
   1471 			OMX_ErrorBadParameter, NULL);
   1472 
   1473 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
   1474 
   1475 	DOMX_ENTER
   1476 		("hComponent = %p, pCompPrv = %p, nParamIndex = %d, pParamStruct = %p",
   1477 		 hComponent, pCompPrv, nParamIndex, pParamStruct);
   1478 
   1479 	switch(nParamIndex)
   1480 	{
   1481 		case OMX_TI_IndexUseBufferDescriptor:
   1482 		     ptBufDescParam = (OMX_TI_PARAM_USEBUFFERDESCRIPTOR *) pParamStruct;
   1483 		     if(pCompPrv->proxyPortBuffers[ptBufDescParam->nPortIndex].proxyBufferType == BufferDescriptorVirtual2D)
   1484 		     {
   1485 			     ptBufDescParam->bEnabled = OMX_TRUE;
   1486 			     ptBufDescParam->eBufferType = OMX_TI_BufferTypeVirtual2D;
   1487 		     }
   1488 		     else
   1489 		     {
   1490 			     ptBufDescParam->bEnabled = OMX_FALSE;
   1491 			     ptBufDescParam->eBufferType = OMX_TI_BufferTypeMax;
   1492 		     }
   1493 		     break;
   1494 
   1495 		default:
   1496 		{
   1497 #ifdef USE_ION
   1498 			if (pAuxBuf != NULL) {
   1499 				int fd = *((int*)pAuxBuf);
   1500 				if (fd > -1) {
   1501 					eRPCError = RPC_RegisterBuffer(pCompPrv->hRemoteComp, *((int*)pAuxBuf),
   1502 							   &pRegistered, NULL, IONPointers);
   1503 					PROXY_checkRpcError();
   1504 					if (pRegistered)
   1505 						*pAuxBuf = pRegistered;
   1506 				}
   1507 			}
   1508 #endif
   1509 			eRPCError = RPC_GetParameter(pCompPrv->hRemoteComp, nParamIndex, pParamStruct,
   1510 				pLocBufNeedMap, &eCompReturn);
   1511 #ifdef USE_ION
   1512 			PROXY_checkRpcError();
   1513 			if (pRegistered != NULL) {
   1514 				eRPCError = RPC_UnRegisterBuffer(pCompPrv->hRemoteComp, pRegistered);
   1515 				PROXY_checkRpcError();
   1516 			}
   1517 #endif
   1518 		}
   1519 	}
   1520 
   1521 	PROXY_checkRpcError();
   1522 
   1523 EXIT:
   1524 	DOMX_EXIT("eError: %d index: 0x%x", eError, nParamIndex);
   1525 	return eError;
   1526 }
   1527 
   1528 /* ===========================================================================*/
   1529 /**
   1530  * @name PROXY_GetParameter()
   1531  * @brief
   1532  * @param void
   1533  * @return OMX_ErrorNone = Successful
   1534  * @sa TBD
   1535  *
   1536  */
   1537 /* ===========================================================================*/
   1538 OMX_ERRORTYPE PROXY_GetParameter(OMX_IN OMX_HANDLETYPE hComponent,
   1539     OMX_IN OMX_INDEXTYPE nParamIndex, OMX_INOUT OMX_PTR pParamStruct)
   1540 {
   1541 	return __PROXY_GetParameter(hComponent, nParamIndex, pParamStruct, NULL);
   1542 }
   1543 
   1544 /* ===========================================================================*/
   1545 /**
   1546  * @name __PROXY_GetConfig()
   1547  * @brief
   1548  * @param void
   1549  * @return OMX_ErrorNone = Successful
   1550  * @sa TBD
   1551  *
   1552  */
   1553 /* ===========================================================================*/
   1554 OMX_ERRORTYPE __PROXY_GetConfig(OMX_HANDLETYPE hComponent,
   1555 	OMX_INDEXTYPE nConfigIndex, OMX_PTR pConfigStruct, OMX_PTR pLocBufNeedMap)
   1556 {
   1557 #ifdef USE_ION
   1558 	OMX_PTR *pAuxBuf = pLocBufNeedMap;
   1559 	OMX_PTR pRegistered = NULL;
   1560 #endif
   1561 
   1562 	OMX_ERRORTYPE eError = OMX_ErrorNone, eCompReturn = OMX_ErrorNone;
   1563 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
   1564 	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
   1565 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
   1566 
   1567 	PROXY_require((pConfigStruct != NULL), OMX_ErrorBadParameter, NULL);
   1568 	PROXY_require((hComp->pComponentPrivate != NULL),
   1569 		OMX_ErrorBadParameter, NULL);
   1570 
   1571 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
   1572 
   1573 	DOMX_ENTER("hComponent = %p, pCompPrv = %p, nConfigIndex = %d, "
   1574 				"pConfigStruct = %p",
   1575 				hComponent, pCompPrv, nConfigIndex,
   1576 				pConfigStruct);
   1577 
   1578 #ifdef USE_ION
   1579 	if (pAuxBuf != NULL) {
   1580 		int fd = *((int*)pAuxBuf);
   1581 		if (fd > -1) {
   1582 			eRPCError = RPC_RegisterBuffer(pCompPrv->hRemoteComp, *((int*)pAuxBuf),
   1583 					   &pRegistered, NULL, IONPointers);
   1584 			PROXY_checkRpcError();
   1585 			if (pRegistered)
   1586 				*pAuxBuf = pRegistered;
   1587 		}
   1588 	}
   1589 #endif
   1590 
   1591 	eRPCError =
   1592 		RPC_GetConfig(pCompPrv->hRemoteComp, nConfigIndex, pConfigStruct,
   1593 			pLocBufNeedMap, &eCompReturn);
   1594 #ifdef USE_ION
   1595 	PROXY_checkRpcError();
   1596 	if (pRegistered != NULL) {
   1597 		eRPCError = RPC_UnRegisterBuffer(pCompPrv->hRemoteComp, pRegistered);
   1598 		PROXY_checkRpcError();
   1599 	}
   1600 #endif
   1601 
   1602 	PROXY_checkRpcError();
   1603 
   1604  EXIT:
   1605 	DOMX_EXIT("eError: %d", eError);
   1606 	return eError;
   1607 }
   1608 
   1609 /* ===========================================================================*/
   1610 /**
   1611  * @name PROXY_GetConfig()
   1612  * @brief
   1613  * @param void
   1614  * @return OMX_ErrorNone = Successful
   1615  * @sa TBD
   1616  *
   1617  */
   1618 /* ===========================================================================*/
   1619 OMX_ERRORTYPE PROXY_GetConfig(OMX_HANDLETYPE hComponent,
   1620 	OMX_INDEXTYPE nConfigIndex, OMX_PTR pConfigStruct)
   1621 {
   1622 	return __PROXY_GetConfig(hComponent, nConfigIndex, pConfigStruct, NULL);
   1623 }
   1624 
   1625 /* ===========================================================================*/
   1626 /**
   1627  * @name __PROXY_SetConfig()
   1628  * @brief
   1629  * @param void
   1630  * @return OMX_ErrorNone = Successful
   1631  * @sa TBD
   1632  *
   1633  */
   1634 /* ===========================================================================*/
   1635 OMX_ERRORTYPE __PROXY_SetConfig(OMX_IN OMX_HANDLETYPE hComponent,
   1636 	OMX_IN OMX_INDEXTYPE nConfigIndex, OMX_IN OMX_PTR pConfigStruct,
   1637 	OMX_PTR pLocBufNeedMap)
   1638 {
   1639 #ifdef USE_ION
   1640 	OMX_PTR *pAuxBuf = pLocBufNeedMap;
   1641 	OMX_PTR pRegistered = NULL;
   1642 #endif
   1643 
   1644 	OMX_ERRORTYPE eError = OMX_ErrorNone, eCompReturn = OMX_ErrorNone;
   1645 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
   1646 	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
   1647 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
   1648 
   1649 	PROXY_require((pConfigStruct != NULL), OMX_ErrorBadParameter, NULL);
   1650 
   1651 	PROXY_assert((hComp->pComponentPrivate != NULL),
   1652 		OMX_ErrorBadParameter, NULL);
   1653 
   1654 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
   1655 
   1656 	DOMX_ENTER("hComponent = %p, pCompPrv = %p, nConfigIndex = %d, "
   1657 				"pConfigStruct = %p",
   1658 				hComponent, pCompPrv, nConfigIndex,
   1659 				pConfigStruct);
   1660 
   1661 #ifdef USE_ION
   1662 	if (pAuxBuf != NULL) {
   1663 		int fd = *((int*)pAuxBuf);
   1664 		if (fd > -1) {
   1665 			eRPCError = RPC_RegisterBuffer(pCompPrv->hRemoteComp, *((int*)pAuxBuf),
   1666 					   &pRegistered, NULL, IONPointers);
   1667 			PROXY_checkRpcError();
   1668 			if (pRegistered)
   1669 				*pAuxBuf = pRegistered;
   1670 		}
   1671 	}
   1672 #endif
   1673 
   1674 	eRPCError =
   1675 		RPC_SetConfig(pCompPrv->hRemoteComp, nConfigIndex, pConfigStruct,
   1676 			pLocBufNeedMap, &eCompReturn);
   1677 
   1678 #ifdef USE_ION
   1679 	PROXY_checkRpcError();
   1680 	if (pRegistered != NULL) {
   1681 		eRPCError = RPC_UnRegisterBuffer(pCompPrv->hRemoteComp, pRegistered);
   1682 		PROXY_checkRpcError();
   1683 	}
   1684 #endif
   1685 
   1686 	PROXY_checkRpcError();
   1687 
   1688       EXIT:
   1689 	DOMX_EXIT("eError: %d", eError);
   1690 	return eError;
   1691 }
   1692 
   1693 /* ===========================================================================*/
   1694 /**
   1695  * @name PROXY_SetConfig()
   1696  * @brief
   1697  * @param void
   1698  * @return OMX_ErrorNone = Successful
   1699  * @sa TBD
   1700  *
   1701  */
   1702 /* ===========================================================================*/
   1703 OMX_ERRORTYPE PROXY_SetConfig(OMX_IN OMX_HANDLETYPE hComponent,
   1704     OMX_IN OMX_INDEXTYPE nConfigIndex, OMX_IN OMX_PTR pConfigStruct)
   1705 {
   1706 	return __PROXY_SetConfig(hComponent, nConfigIndex, pConfigStruct, NULL);
   1707 }
   1708 
   1709 
   1710 /* ===========================================================================*/
   1711 /**
   1712  * @name PROXY_GetState()
   1713  * @brief
   1714  * @param void
   1715  * @return OMX_ErrorNone = Successful
   1716  * @sa TBD
   1717  *
   1718  */
   1719 /* ===========================================================================*/
   1720 static OMX_ERRORTYPE PROXY_GetState(OMX_IN OMX_HANDLETYPE hComponent,
   1721     OMX_OUT OMX_STATETYPE * pState)
   1722 {
   1723 	OMX_ERRORTYPE eError = OMX_ErrorNone, eCompReturn = OMX_ErrorNone;
   1724 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
   1725 	OMX_COMPONENTTYPE *hComp = hComponent;
   1726 	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
   1727 
   1728 	PROXY_require((pState != NULL), OMX_ErrorBadParameter, NULL);
   1729 	PROXY_require((hComp->pComponentPrivate != NULL),
   1730 	    OMX_ErrorBadParameter, NULL);
   1731 
   1732 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
   1733 
   1734 	DOMX_ENTER("hComponent = %p, pCompPrv = %p", hComponent, pCompPrv);
   1735 
   1736 	eRPCError = RPC_GetState(pCompPrv->hRemoteComp, pState, &eCompReturn);
   1737 
   1738 	DOMX_DEBUG("Returned from RPC_GetState, state: = %x", *pState);
   1739 
   1740 	PROXY_checkRpcError();
   1741 
   1742       EXIT:
   1743 	if (eError == OMX_ErrorHardware)
   1744 	{
   1745 		*pState = OMX_StateInvalid;
   1746 		eError = OMX_ErrorNone;
   1747 		DOMX_DEBUG("Invalid state returned from RPC_GetState, state due to ducati in faulty state");
   1748 	}
   1749 	DOMX_EXIT("eError: %d", eError);
   1750 	return eError;
   1751 }
   1752 
   1753 
   1754 
   1755 /* ===========================================================================*/
   1756 /**
   1757  * @name PROXY_SendCommand()
   1758  * @brief
   1759  * @param void
   1760  * @return OMX_ErrorNone = Successful
   1761  * @sa TBD
   1762  *
   1763  */
   1764 /* ===========================================================================*/
   1765 OMX_ERRORTYPE PROXY_SendCommand(OMX_IN OMX_HANDLETYPE hComponent,
   1766     OMX_IN OMX_COMMANDTYPE eCmd,
   1767     OMX_IN OMX_U32 nParam, OMX_IN OMX_PTR pCmdData)
   1768 {
   1769 	OMX_ERRORTYPE eError = OMX_ErrorNone, eCompReturn = OMX_ErrorNone;
   1770 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
   1771 	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
   1772 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
   1773 	OMX_COMPONENTTYPE *pMarkComp = NULL;
   1774 	PROXY_COMPONENT_PRIVATE *pMarkCompPrv = NULL;
   1775 	OMX_PTR pMarkData = NULL, pMarkToBeFreedIfError = NULL;
   1776 	OMX_BOOL bIsProxy = OMX_FALSE;
   1777 
   1778 	PROXY_require((hComp->pComponentPrivate != NULL),
   1779 	    OMX_ErrorBadParameter, NULL);
   1780 
   1781 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
   1782 
   1783 	DOMX_ENTER
   1784 	    ("hComponent = %p, pCompPrv = %p, eCmd = %d, nParam = %d, pCmdData = %p",
   1785 	    hComponent, pCompPrv, eCmd, nParam, pCmdData);
   1786 
   1787 	if (eCmd == OMX_CommandMarkBuffer)
   1788 	{
   1789 		PROXY_require(pCmdData != NULL, OMX_ErrorBadParameter, NULL);
   1790 		pMarkComp = (OMX_COMPONENTTYPE *)
   1791 		    (((OMX_MARKTYPE *) pCmdData)->hMarkTargetComponent);
   1792 		PROXY_require(pMarkComp != NULL, OMX_ErrorBadParameter, NULL);
   1793 
   1794 		/* To check if mark comp is a proxy or a real component */
   1795 		eError = _RPC_IsProxyComponent(pMarkComp, &bIsProxy);
   1796 		PROXY_assert(eError == OMX_ErrorNone, eError, "");
   1797 
   1798 		/*Replacing original mark data with proxy specific structure */
   1799 		pMarkData = ((OMX_MARKTYPE *) pCmdData)->pMarkData;
   1800 		((OMX_MARKTYPE *) pCmdData)->pMarkData =
   1801 		    TIMM_OSAL_Malloc(sizeof(PROXY_MARK_DATA), TIMM_OSAL_TRUE,
   1802 		    0, TIMMOSAL_MEM_SEGMENT_INT);
   1803 		PROXY_assert(((OMX_MARKTYPE *) pCmdData)->pMarkData != NULL,
   1804 		    OMX_ErrorInsufficientResources, "Malloc failed");
   1805 		pMarkToBeFreedIfError =
   1806 		    ((OMX_MARKTYPE *) pCmdData)->pMarkData;
   1807 		((PROXY_MARK_DATA *) (((OMX_MARKTYPE *)
   1808 			    pCmdData)->pMarkData))->hComponentActual =
   1809 		    pMarkComp;
   1810 		((PROXY_MARK_DATA *) (((OMX_MARKTYPE *)
   1811 			    pCmdData)->pMarkData))->pMarkDataActual =
   1812 		    pMarkData;
   1813 
   1814 		/* If it is proxy component then replace hMarkTargetComponent
   1815 		   with remote handle */
   1816 		if (bIsProxy)
   1817 		{
   1818 			pMarkCompPrv = pMarkComp->pComponentPrivate;
   1819 			PROXY_assert(pMarkCompPrv != NULL,
   1820 			    OMX_ErrorBadParameter, NULL);
   1821 
   1822 			/* Replacing with remote component handle */
   1823 			((OMX_MARKTYPE *) pCmdData)->hMarkTargetComponent =
   1824 			    ((RPC_OMX_CONTEXT *) pMarkCompPrv->hRemoteComp)->
   1825 			    hActualRemoteCompHandle;
   1826 		}
   1827 	}
   1828 
   1829 	eRPCError =
   1830 	    RPC_SendCommand(pCompPrv->hRemoteComp, eCmd, nParam, pCmdData,
   1831 	    &eCompReturn);
   1832 
   1833 	if (eCmd == OMX_CommandMarkBuffer && bIsProxy)
   1834 	{
   1835 		/*Resetting to original values */
   1836 		((OMX_MARKTYPE *) pCmdData)->hMarkTargetComponent = pMarkComp;
   1837 		((OMX_MARKTYPE *) pCmdData)->pMarkData = pMarkData;
   1838 	}
   1839 
   1840 	PROXY_checkRpcError();
   1841 
   1842       EXIT:
   1843 	/*If SendCommand is about to return an error then this means that the
   1844 	   command has not been accepted by the component. Thus the allocated mark data
   1845 	   will be lost so free it here */
   1846 	if ((eError != OMX_ErrorNone) && pMarkToBeFreedIfError)
   1847 	{
   1848 		TIMM_OSAL_Free(pMarkToBeFreedIfError);
   1849 	}
   1850 	DOMX_EXIT("eError: %d", eError);
   1851 	return eError;
   1852 }
   1853 
   1854 
   1855 
   1856 /* ===========================================================================*/
   1857 /**
   1858  * @name PROXY_GetComponentVersion()
   1859  * @brief
   1860  * @param void
   1861  * @return OMX_ErrorNone = Successful
   1862  * @sa TBD
   1863  *
   1864  */
   1865 /* ===========================================================================*/
   1866 static OMX_ERRORTYPE PROXY_GetComponentVersion(OMX_IN OMX_HANDLETYPE
   1867     hComponent, OMX_OUT OMX_STRING pComponentName,
   1868     OMX_OUT OMX_VERSIONTYPE * pComponentVersion,
   1869     OMX_OUT OMX_VERSIONTYPE * pSpecVersion,
   1870     OMX_OUT OMX_UUIDTYPE * pComponentUUID)
   1871 {
   1872 	OMX_ERRORTYPE eError = OMX_ErrorNone, eCompReturn = OMX_ErrorNone;
   1873 	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
   1874 	OMX_COMPONENTTYPE *hComp = hComponent;
   1875 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
   1876 
   1877 	DOMX_ENTER("hComponent = %p, pCompPrv = %p", hComponent, pCompPrv);
   1878 
   1879 	PROXY_require((hComp->pComponentPrivate != NULL),
   1880 	    OMX_ErrorBadParameter, NULL);
   1881 	PROXY_require(pComponentName != NULL, OMX_ErrorBadParameter, NULL);
   1882 	PROXY_require(pComponentVersion != NULL, OMX_ErrorBadParameter, NULL);
   1883 	PROXY_require(pSpecVersion != NULL, OMX_ErrorBadParameter, NULL);
   1884 	PROXY_require(pComponentUUID != NULL, OMX_ErrorBadParameter, NULL);
   1885 
   1886 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
   1887 
   1888 	eRPCError = RPC_GetComponentVersion(pCompPrv->hRemoteComp,
   1889 	    pComponentName,
   1890 	    pComponentVersion, pSpecVersion, pComponentUUID, &eCompReturn);
   1891 
   1892 	PROXY_checkRpcError();
   1893 
   1894       EXIT:
   1895 	DOMX_EXIT("eError: %d", eError);
   1896 	return eError;
   1897 }
   1898 
   1899 
   1900 
   1901 /* ===========================================================================*/
   1902 /**
   1903  * @name PROXY_GetExtensionIndex()
   1904  * @brief
   1905  * @param void
   1906  * @return OMX_ErrorNone = Successful
   1907  * @sa TBD
   1908  *
   1909  */
   1910 /* ===========================================================================*/
   1911 OMX_ERRORTYPE PROXY_GetExtensionIndex(OMX_IN OMX_HANDLETYPE hComponent,
   1912     OMX_IN OMX_STRING cParameterName, OMX_OUT OMX_INDEXTYPE * pIndexType)
   1913 {
   1914 
   1915 	OMX_ERRORTYPE eError = OMX_ErrorNone, eCompReturn = OMX_ErrorNone;
   1916 	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
   1917 	OMX_COMPONENTTYPE *hComp = hComponent;
   1918 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
   1919 
   1920 	PROXY_require((hComp->pComponentPrivate != NULL),
   1921 	    OMX_ErrorBadParameter, NULL);
   1922 	PROXY_require(cParameterName != NULL, OMX_ErrorBadParameter, NULL);
   1923 	PROXY_require(pIndexType != NULL, OMX_ErrorBadParameter, NULL);
   1924 
   1925 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
   1926 
   1927 	DOMX_ENTER("hComponent = %p, pCompPrv = %p, cParameterName = %s",
   1928 	    hComponent, pCompPrv, cParameterName);
   1929 
   1930 
   1931 #ifdef ENABLE_GRALLOC_BUFFERS
   1932 	// Check for NULL Parameters
   1933 	PROXY_require((cParameterName != NULL && pIndexType != NULL),
   1934 	    OMX_ErrorBadParameter, NULL);
   1935 
   1936 	// Ensure that String length is not greater than Max allowed length
   1937 	PROXY_require(strlen(cParameterName) <= 127, OMX_ErrorBadParameter, NULL);
   1938 
   1939 	if(strcmp(cParameterName, "OMX.google.android.index.enableAndroidNativeBuffers") == 0)
   1940 	{
   1941 		// If Index type is 2D Buffer Allocated Dimension
   1942 		*pIndexType = (OMX_INDEXTYPE) OMX_TI_IndexUseNativeBuffers;
   1943 		goto EXIT;
   1944 	}
   1945 	else if (strcmp(cParameterName, "OMX.google.android.index.useAndroidNativeBuffer2") == 0)
   1946 	{
   1947 		//This is call just a dummy for android to support backward compatibility
   1948 		*pIndexType = (OMX_INDEXTYPE) NULL;
   1949 		goto EXIT;
   1950 	}
   1951 	else
   1952 	{
   1953 		eRPCError = RPC_GetExtensionIndex(pCompPrv->hRemoteComp,
   1954                    cParameterName, pIndexType, &eCompReturn);
   1955 
   1956 		PROXY_checkRpcError();
   1957 	}
   1958 #else
   1959 	eRPCError = RPC_GetExtensionIndex(pCompPrv->hRemoteComp,
   1960 	    cParameterName, pIndexType, &eCompReturn);
   1961 
   1962 	PROXY_checkRpcError();
   1963 #endif
   1964 
   1965       EXIT:
   1966 	DOMX_EXIT("eError: %d", eError);
   1967 	return eError;
   1968 }
   1969 
   1970 
   1971 
   1972 
   1973 /* ===========================================================================*/
   1974 /**
   1975  * @name PROXY_ComponentRoleEnum()
   1976  * @brief
   1977  * @param void
   1978  * @return OMX_ErrorNone = Successful
   1979  * @sa TBD
   1980  *
   1981  */
   1982 /* ===========================================================================*/
   1983 static OMX_ERRORTYPE PROXY_ComponentRoleEnum(OMX_IN OMX_HANDLETYPE hComponent,
   1984     OMX_OUT OMX_U8 * cRole, OMX_IN OMX_U32 nIndex)
   1985 {
   1986 	OMX_ERRORTYPE eError = OMX_ErrorNone;
   1987 
   1988 	DOMX_ENTER("hComponent = %p", hComponent);
   1989 	DOMX_DEBUG(" EMPTY IMPLEMENTATION ");
   1990 
   1991 	DOMX_EXIT("eError: %d", eError);
   1992 	return eError;
   1993 }
   1994 
   1995 
   1996 /* ===========================================================================*/
   1997 /**
   1998  * @name PROXY_ComponentTunnelRequest()
   1999  * @brief
   2000  * @param void
   2001  * @return OMX_ErrorNone = Successful
   2002  * @sa TBD
   2003  *
   2004  */
   2005 /* ===========================================================================*/
   2006 static OMX_ERRORTYPE PROXY_ComponentTunnelRequest(OMX_IN OMX_HANDLETYPE
   2007     hComponent, OMX_IN OMX_U32 nPort, OMX_IN OMX_HANDLETYPE hTunneledComp,
   2008     OMX_IN OMX_U32 nTunneledPort,
   2009     OMX_INOUT OMX_TUNNELSETUPTYPE * pTunnelSetup)
   2010 {
   2011 	OMX_ERRORTYPE eError = OMX_ErrorNone;
   2012 
   2013 	DOMX_ENTER("hComponent = %p", hComponent);
   2014 	DOMX_DEBUG(" EMPTY IMPLEMENTATION ");
   2015 	PROXY_COMPONENT_PRIVATE *pOutCompPrv = NULL;
   2016 	PROXY_COMPONENT_PRIVATE *pInCompPrv  = NULL;
   2017 	OMX_COMPONENTTYPE       *hOutComp    = hComponent;
   2018 	OMX_COMPONENTTYPE       *hInComp     = hTunneledComp;
   2019 	OMX_ERRORTYPE           eCompReturn = OMX_ErrorNone;
   2020 	RPC_OMX_ERRORTYPE       eRPCError    = RPC_OMX_ErrorNone;
   2021 	PROXY_assert((hOutComp->pComponentPrivate != NULL),
   2022 	    OMX_ErrorBadParameter, NULL);
   2023 	PROXY_assert((hInComp->pComponentPrivate != NULL),
   2024 	    OMX_ErrorBadParameter, NULL);
   2025 
   2026         //TBD
   2027         //PROXY_assert(nPort != 1, OMX_ErrorBadParameter, NULL);
   2028         //PROXY_assert(nTunnelPort != 0, OMX_ErrorBadParameter, NULL);
   2029 	pOutCompPrv = (PROXY_COMPONENT_PRIVATE *) hOutComp->pComponentPrivate;
   2030 	pInCompPrv  = (PROXY_COMPONENT_PRIVATE *) hInComp->pComponentPrivate;
   2031 	DOMX_ENTER("hOutComp=%p, pOutCompPrv=%p, hInComp=%p, pInCompPrv=%p, nOutPort=%d, nInPort=%d \n",
   2032 	        hOutComp, pOutCompPrv, hInComp, pInCompPrv, nPort, nTunneledPort);
   2033 
   2034 	DOMX_INFO("PROXY_ComponentTunnelRequest:: hOutComp=%p, pOutCompPrv=%p, hInComp=%p, pInCompPrv=%p, nOutPort=%d, nInPort=%d \n ",
   2035 	        hOutComp, pOutCompPrv, hInComp, pInCompPrv, nPort, nTunneledPort);
   2036        eRPCError = RPC_ComponentTunnelRequest(pOutCompPrv->hRemoteComp, nPort,
   2037 	        pInCompPrv->hRemoteComp, nTunneledPort, pTunnelSetup, &eCompReturn);
   2038         DOMX_INFO("\nafter: RPC_ComponentTunnelRequest = 0x%x\n ", eRPCError);
   2039         PROXY_checkRpcError();
   2040 
   2041 EXIT:
   2042 	DOMX_EXIT("eError: %d", eError);
   2043 	return eError;
   2044 }
   2045 
   2046 
   2047 /* ===========================================================================*/
   2048 /**
   2049  * @name PROXY_SetCallbacks()
   2050  * @brief
   2051  * @param void
   2052  * @return OMX_ErrorNone = Successful
   2053  * @sa TBD
   2054  *
   2055  */
   2056 /* ===========================================================================*/
   2057 static OMX_ERRORTYPE PROXY_SetCallbacks(OMX_HANDLETYPE hComponent,
   2058     OMX_CALLBACKTYPE * pCallBacks, OMX_PTR pAppData)
   2059 {
   2060 	OMX_ERRORTYPE eError = OMX_ErrorNone;
   2061 	PROXY_COMPONENT_PRIVATE *pCompPrv;
   2062 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
   2063 
   2064 	PROXY_require((pCallBacks != NULL), OMX_ErrorBadParameter, NULL);
   2065 
   2066 	PROXY_assert((hComp->pComponentPrivate != NULL),
   2067 	    OMX_ErrorBadParameter, NULL);
   2068 
   2069 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
   2070 
   2071 	DOMX_ENTER("hComponent = %p, pCompPrv = %p", hComponent, pCompPrv);
   2072 
   2073 	/*Store App callback and data to proxy- managed by proxy */
   2074 	pCompPrv->tCBFunc = *pCallBacks;
   2075 	pCompPrv->pILAppData = pAppData;
   2076 
   2077       EXIT:
   2078 	DOMX_EXIT("eError: %d", eError);
   2079 	return eError;
   2080 }
   2081 
   2082 
   2083 /* ===========================================================================*/
   2084 /**
   2085  * @name PROXY_UseEGLImage()
   2086  * @brief : This returns error not implemented by default as no component
   2087  *          implements this. In case there is a requiremet, support for this
   2088  *          can be added later.
   2089  *
   2090  */
   2091 /* ===========================================================================*/
   2092 static OMX_ERRORTYPE PROXY_UseEGLImage(OMX_HANDLETYPE hComponent,
   2093     OMX_BUFFERHEADERTYPE ** ppBufferHdr,
   2094     OMX_U32 nPortIndex, OMX_PTR pAppPrivate, void *pBuffer)
   2095 {
   2096 	return OMX_ErrorNotImplemented;
   2097 }
   2098 
   2099 
   2100 /* ===========================================================================*/
   2101 /**
   2102  * @name PROXY_ComponentDeInit()
   2103  * @brief
   2104  * @param void
   2105  * @return OMX_ErrorNone = Successful
   2106  * @sa TBD
   2107  *
   2108  */
   2109 /* ===========================================================================*/
   2110 OMX_ERRORTYPE PROXY_ComponentDeInit(OMX_HANDLETYPE hComponent)
   2111 {
   2112 	OMX_ERRORTYPE eError = OMX_ErrorNone, eCompReturn = OMX_ErrorNone;
   2113 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone, eTmpRPCError =
   2114 	    RPC_OMX_ErrorNone;
   2115 	PROXY_COMPONENT_PRIVATE *pCompPrv;
   2116 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
   2117 	OMX_U32 count = 0, nStride = 0;
   2118 	OMX_PTR pMetaDataBuffer = NULL;
   2119 
   2120 	DOMX_ENTER("hComponent = %p", hComponent);
   2121 
   2122 	PROXY_assert((hComp->pComponentPrivate != NULL),
   2123 	    OMX_ErrorBadParameter, NULL);
   2124 
   2125 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
   2126 
   2127 	ion_close(pCompPrv->ion_fd);
   2128 
   2129 	for (count = 0; count < pCompPrv->nTotalBuffers; count++)
   2130 	{
   2131 		if (pCompPrv->tBufList[count].pBufHeader)
   2132 		{
   2133 #ifdef ALLOCATE_TILER_BUFFER_IN_PROXY
   2134 			if(pCompPrv->tBufList[count].pYBuffer)
   2135 			{
   2136 #ifdef USE_ION
   2137 				if(pCompPrv->tBufList[count].pYBuffer)
   2138 				{
   2139 					if (pCompPrv->bUseIon == OMX_TRUE)
   2140 					{
   2141 						if(pCompPrv->bMapIonBuffers == OMX_TRUE)
   2142 						{
   2143 					                munmap(pCompPrv->tBufList[count].pBufHeader->pBuffer, pCompPrv->tBufList[count].pBufHeader->nAllocLen);
   2144 							close(pCompPrv->tBufList[count].mmap_fd);
   2145 						}
   2146 						ion_free(pCompPrv->ion_fd, pCompPrv->tBufList[count].pYBuffer);
   2147 						pCompPrv->tBufList[count].pYBuffer = NULL;
   2148 					}
   2149 				}
   2150 #endif
   2151 			}
   2152 #endif
   2153 			pMetaDataBuffer = ((OMX_TI_PLATFORMPRIVATE *)(pCompPrv->tBufList[count].pBufHeader)->
   2154 				pPlatformPrivate)->pMetaDataBuffer;
   2155 			if (pMetaDataBuffer)
   2156 			{
   2157 #ifdef USE_ION
   2158 				if (pCompPrv->bUseIon == OMX_TRUE)
   2159 				{
   2160 					if(pCompPrv->bMapIonBuffers == OMX_TRUE)
   2161 					{
   2162 			                        munmap(pMetaDataBuffer, ((OMX_TI_PLATFORMPRIVATE *)(pCompPrv->tBufList[count].pBufHeader)->
   2163 								pPlatformPrivate)->nMetaDataSize);
   2164 					}
   2165 					close(pCompPrv->tBufList[count].mmap_fd_metadata_buff);
   2166 					ion_free(pCompPrv->ion_fd, pMetaDataBuffer);
   2167 					((OMX_TI_PLATFORMPRIVATE *)(pCompPrv->tBufList[count].pBufHeader)->
   2168 						pPlatformPrivate)->pMetaDataBuffer = NULL;
   2169 				}
   2170 #endif
   2171 			}
   2172 			if (pCompPrv->tBufList[count].pBufHeader->pPlatformPrivate)
   2173 			{
   2174 				TIMM_OSAL_Free(pCompPrv->tBufList[count].pBufHeader->
   2175 				    pPlatformPrivate);
   2176 			}
   2177 			TIMM_OSAL_Free(pCompPrv->tBufList[count].pBufHeader);
   2178 			TIMM_OSAL_Memset(&(pCompPrv->tBufList[count]), 0,
   2179 			    sizeof(PROXY_BUFFER_INFO));
   2180 		}
   2181 	}
   2182 
   2183 	KPI_OmxCompDeinit(hComponent);
   2184 
   2185 	eRPCError = RPC_FreeHandle(pCompPrv->hRemoteComp, &eCompReturn);
   2186 	if (eRPCError != RPC_OMX_ErrorNone)
   2187 		eTmpRPCError = eRPCError;
   2188 
   2189 	eRPCError = RPC_InstanceDeInit(pCompPrv->hRemoteComp);
   2190 	if (eRPCError != RPC_OMX_ErrorNone)
   2191 		eTmpRPCError = eRPCError;
   2192 
   2193 	if (pCompPrv->cCompName)
   2194 	{
   2195 		TIMM_OSAL_Free(pCompPrv->cCompName);
   2196 	}
   2197 
   2198 	if (pCompPrv)
   2199 	{
   2200 		TIMM_OSAL_Free(pCompPrv);
   2201 	}
   2202 
   2203 	eRPCError = eTmpRPCError;
   2204 	PROXY_checkRpcError();
   2205 
   2206       EXIT:
   2207 	DOMX_EXIT("eError: %d", eError);
   2208 	return eError;
   2209 }
   2210 
   2211 
   2212 /* ===========================================================================*/
   2213 /**
   2214  * @name OMX_ProxyCommonInit()
   2215  * @brief
   2216  * @param void
   2217  * @return OMX_ErrorNone = Successful
   2218  * @sa TBD
   2219  *
   2220  */
   2221 /* ===========================================================================*/
   2222 OMX_ERRORTYPE OMX_ProxyCommonInit(OMX_HANDLETYPE hComponent)
   2223 {
   2224 	OMX_ERRORTYPE eError = OMX_ErrorNone, eCompReturn = OMX_ErrorNone;
   2225 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
   2226 	PROXY_COMPONENT_PRIVATE *pCompPrv;
   2227 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
   2228 	OMX_HANDLETYPE hRemoteComp = NULL;
   2229         OMX_U32 i = 0;
   2230 
   2231 	DOMX_ENTER("hComponent = %p", hComponent);
   2232 
   2233 	TIMM_OSAL_UpdateTraceLevel();
   2234 
   2235 	PROXY_require((hComp->pComponentPrivate != NULL),
   2236 	    OMX_ErrorBadParameter, NULL);
   2237 
   2238 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
   2239 
   2240 	pCompPrv->nTotalBuffers = 0;
   2241 	pCompPrv->nAllocatedBuffers = 0;
   2242 	pCompPrv->proxyEmptyBufferDone = PROXY_EmptyBufferDone;
   2243 	pCompPrv->proxyFillBufferDone = PROXY_FillBufferDone;
   2244 	pCompPrv->proxyEventHandler = PROXY_EventHandler;
   2245 
   2246         for (i=0; i<PROXY_MAXNUMOFPORTS ; i++)
   2247         {
   2248               pCompPrv->proxyPortBuffers[i].proxyBufferType = VirtualPointers;
   2249         }
   2250 
   2251 	eRPCError = RPC_InstanceInit(pCompPrv->cCompName, &hRemoteComp);
   2252 	PROXY_assert(eRPCError == RPC_OMX_ErrorNone,
   2253 	    OMX_ErrorUndefined, "Error initializing RPC");
   2254 	PROXY_assert(hRemoteComp != NULL,
   2255 	    OMX_ErrorUndefined, "Error initializing RPC");
   2256 
   2257 	//Send the proxy component handle for pAppData
   2258 	eRPCError =
   2259 	    RPC_GetHandle(hRemoteComp, pCompPrv->cCompName,
   2260 	    (OMX_PTR) hComponent, NULL, &eCompReturn);
   2261 
   2262 	PROXY_checkRpcError();
   2263 
   2264 	hComp->SetCallbacks = PROXY_SetCallbacks;
   2265 	hComp->ComponentDeInit = PROXY_ComponentDeInit;
   2266 	hComp->UseBuffer = PROXY_UseBuffer;
   2267 	hComp->GetParameter = PROXY_GetParameter;
   2268 	hComp->SetParameter = PROXY_SetParameter;
   2269 	hComp->EmptyThisBuffer = PROXY_EmptyThisBuffer;
   2270 	hComp->FillThisBuffer = PROXY_FillThisBuffer;
   2271 	hComp->GetComponentVersion = PROXY_GetComponentVersion;
   2272 	hComp->SendCommand = PROXY_SendCommand;
   2273 	hComp->GetConfig = PROXY_GetConfig;
   2274 	hComp->SetConfig = PROXY_SetConfig;
   2275 	hComp->GetState = PROXY_GetState;
   2276 	hComp->GetExtensionIndex = PROXY_GetExtensionIndex;
   2277 	hComp->FreeBuffer = PROXY_FreeBuffer;
   2278 	hComp->ComponentRoleEnum = PROXY_ComponentRoleEnum;
   2279 	hComp->AllocateBuffer = PROXY_AllocateBuffer;
   2280 	hComp->ComponentTunnelRequest = PROXY_ComponentTunnelRequest;
   2281 	hComp->UseEGLImage = PROXY_UseEGLImage;
   2282 
   2283 	pCompPrv->hRemoteComp = hRemoteComp;
   2284 
   2285 #ifdef USE_ION
   2286 	pCompPrv->bUseIon = OMX_TRUE;
   2287 	pCompPrv->bMapIonBuffers = OMX_TRUE;
   2288 
   2289 	pCompPrv->ion_fd = ion_open();
   2290 	if(pCompPrv->ion_fd == 0)
   2291 	{
   2292 		DOMX_ERROR("ion_open failed!!!");
   2293 		return OMX_ErrorInsufficientResources;
   2294 	}
   2295 #endif
   2296 
   2297 	KPI_OmxCompInit(hComponent);
   2298 
   2299       EXIT:
   2300 	if (eError != OMX_ErrorNone)
   2301 		RPC_InstanceDeInit(hRemoteComp);
   2302 	DOMX_EXIT("eError: %d", eError);
   2303 
   2304 	return eError;
   2305 }
   2306 
   2307 
   2308 
   2309 /* ===========================================================================*/
   2310 /**
   2311  * @name RPC_UTIL_GetStride()
   2312  * @brief Gets stride on this port. Used to determine whether buffer is 1D or 2D
   2313  * @param hRemoteComp [IN]  : Remote component handle.
   2314  * @param nPortIndex [IN]   : Port index.
   2315  * @param nStride [OUT]     : Stride returned by the component.
   2316  * @return OMX_ErrorNone = Successful
   2317  */
   2318 /* ===========================================================================*/
   2319 OMX_ERRORTYPE RPC_UTIL_GetStride(OMX_COMPONENTTYPE * hRemoteComp,
   2320     OMX_U32 nPortIndex, OMX_U32 * nStride)
   2321 {
   2322 	OMX_ERRORTYPE eError = OMX_ErrorNone, eCompReturn = OMX_ErrorNone;
   2323 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
   2324 	OMX_PARAM_PORTDEFINITIONTYPE sPortDef;
   2325 
   2326 	/*Initializing Structure */
   2327 	sPortDef.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
   2328 	sPortDef.nVersion.s.nVersionMajor = OMX_VER_MAJOR;
   2329 	sPortDef.nVersion.s.nVersionMinor = OMX_VER_MINOR;
   2330 	sPortDef.nVersion.s.nRevision = 0x0;
   2331 	sPortDef.nVersion.s.nStep = 0x0;
   2332 	sPortDef.nPortIndex = nPortIndex;
   2333 
   2334 	eRPCError =
   2335 	    RPC_GetParameter(hRemoteComp, OMX_IndexParamPortDefinition,
   2336 	    (OMX_PTR) (&sPortDef), NULL, &eCompReturn);
   2337 	PROXY_checkRpcError();
   2338 
   2339 	if (sPortDef.eDomain == OMX_PortDomainVideo)
   2340 	{
   2341 		*nStride = sPortDef.format.video.nStride;
   2342 	} else if (sPortDef.eDomain == OMX_PortDomainImage)
   2343 	{
   2344 		*nStride = sPortDef.format.image.nStride;
   2345 	} else if (sPortDef.eDomain == OMX_PortDomainMax && nPortIndex == 0)
   2346 	{
   2347 		/*Temp - just for testing sample */
   2348 		*nStride = LINUX_PAGE_SIZE;
   2349 	} else
   2350 	{
   2351 		*nStride = 0;
   2352 	}
   2353 
   2354       EXIT:
   2355 	return eError;
   2356 }
   2357 
   2358 
   2359 
   2360 /* ===========================================================================*/
   2361 /**
   2362  * @name RPC_UTIL_GetNumLines()
   2363  * @brief
   2364  * @param void
   2365  * @return OMX_ErrorNone = Successful
   2366  * @sa TBD
   2367  *
   2368  */
   2369 /* ===========================================================================*/
   2370 OMX_ERRORTYPE RPC_UTIL_GetNumLines(OMX_COMPONENTTYPE * hRemoteComp,
   2371     OMX_U32 nPortIndex, OMX_U32 * nNumOfLines)
   2372 {
   2373 	OMX_ERRORTYPE eError = OMX_ErrorNone;
   2374 	OMX_ERRORTYPE eCompReturn;
   2375 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
   2376 	OMX_BOOL bUseEnhancedPortReconfig = OMX_FALSE;
   2377 
   2378 	OMX_PARAM_PORTDEFINITIONTYPE portDef;
   2379 	OMX_CONFIG_RECTTYPE sRect;
   2380 
   2381 	DOMX_ENTER("");
   2382 
   2383 	/*initializing Structure */
   2384 	portDef.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
   2385 	portDef.nVersion.s.nVersionMajor = 0x1;
   2386 	portDef.nVersion.s.nVersionMinor = 0x1;
   2387 	portDef.nVersion.s.nRevision = 0x0;
   2388 	portDef.nVersion.s.nStep = 0x0;
   2389 
   2390 	portDef.nPortIndex = nPortIndex;
   2391 
   2392 	sRect.nSize = sizeof(OMX_CONFIG_RECTTYPE);
   2393 	sRect.nVersion.s.nVersionMajor = 0x1;
   2394 	sRect.nVersion.s.nVersionMinor = 0x1;
   2395 	sRect.nVersion.s.nRevision = 0x0;
   2396 	sRect.nVersion.s.nStep = 0x0;
   2397 
   2398 	sRect.nPortIndex = nPortIndex;
   2399 	sRect.nLeft = 0;
   2400 	sRect.nTop = 0;
   2401 	sRect.nHeight = 0;
   2402 	sRect.nWidth = 0;
   2403 
   2404 #ifdef USE_ENHANCED_PORTRECONFIG
   2405 	bUseEnhancedPortReconfig = OMX_TRUE;
   2406 #endif
   2407 	eRPCError = RPC_GetParameter(hRemoteComp,
   2408 	    OMX_TI_IndexParam2DBufferAllocDimension,
   2409 	    (OMX_PTR) & sRect, NULL, &eCompReturn);
   2410 	if (eRPCError == RPC_OMX_ErrorNone)
   2411 	{
   2412 		DOMX_DEBUG(" PROXY_UTIL Get Parameter Successful");
   2413 		eError = eCompReturn;
   2414 	} else
   2415 	{
   2416 		DOMX_ERROR("RPC_GetParameter returned error 0x%x", eRPCError);
   2417 		eError = OMX_ErrorUndefined;
   2418 		goto EXIT;
   2419 	}
   2420 
   2421 	if (eCompReturn == OMX_ErrorNone && bUseEnhancedPortReconfig == OMX_FALSE)
   2422 	{
   2423 		*nNumOfLines = sRect.nHeight;
   2424 	} else if (eCompReturn == OMX_ErrorUnsupportedIndex || bUseEnhancedPortReconfig == OMX_TRUE)
   2425 	{
   2426 		eRPCError =
   2427 		    RPC_GetParameter(hRemoteComp,
   2428 		    OMX_IndexParamPortDefinition, (OMX_PTR) & portDef,
   2429 		    NULL, &eCompReturn);
   2430 
   2431 		if (eRPCError == RPC_OMX_ErrorNone)
   2432 		{
   2433 			DOMX_DEBUG(" PROXY_UTIL Get Parameter Successful");
   2434 			eError = eCompReturn;
   2435 		} else
   2436 		{
   2437 			DOMX_ERROR("RPC_GetParameter returned error 0x%x",
   2438 			    eRPCError);
   2439 			eError = OMX_ErrorUndefined;
   2440 			goto EXIT;
   2441 		}
   2442 
   2443 		if (eCompReturn == OMX_ErrorNone)
   2444 		{
   2445 
   2446 			//start with 1 meaning 1D buffer
   2447 			*nNumOfLines = 1;
   2448 
   2449 			if (portDef.eDomain == OMX_PortDomainVideo)
   2450 			{
   2451 				*nNumOfLines =
   2452 				    portDef.format.video.nFrameHeight;
   2453 				//DOMX_DEBUG("Port definition Type is video...");
   2454 				//DOMX_DEBUG("&&Colorformat is:%p", portDef.format.video.eColorFormat);
   2455 				//DOMX_DEBUG("nFrameHeight is:%d", portDef.format.video.nFrameHeight);
   2456 				//*nNumOfLines = portDef.format.video.nFrameHeight;
   2457 
   2458 				//if((portDef.format.video.eColorFormat == OMX_COLOR_FormatYUV420PackedSemiPlanar) ||
   2459 				//  (portDef.format.video.eColorFormat == OMX_COLOR_FormatYUV420Planar))
   2460 				//{
   2461 				//DOMX_DEBUG("Setting FrameHeight as Number of lines...");
   2462 				//*nNumOfLines = portDef.format.video.nFrameHeight;
   2463 				//}
   2464 			} else if (portDef.eDomain == OMX_PortDomainImage)
   2465 			{
   2466 				DOMX_DEBUG
   2467 				    ("Image DOMAIN TILER SUPPORT for NV12 format only");
   2468 				*nNumOfLines =
   2469 				    portDef.format.image.nFrameHeight;
   2470 			} else if (portDef.eDomain == OMX_PortDomainAudio)
   2471 			{
   2472 				DOMX_DEBUG("Audio DOMAIN TILER SUPPORT");
   2473 			} else if (portDef.eDomain == OMX_PortDomainOther)
   2474 			{
   2475 				DOMX_DEBUG("Other DOMAIN TILER SUPPORT");
   2476 			} else
   2477 			{	//this is the sample component test
   2478 				//Temporary - just to get check functionality
   2479 				DOMX_DEBUG("Sample component TILER SUPPORT");
   2480 				*nNumOfLines = 4;
   2481 			}
   2482 		} else
   2483 		{
   2484 			DOMX_ERROR(" ERROR IN RECOVERING UV POINTER");
   2485 		}
   2486 	} else
   2487 	{
   2488 		DOMX_ERROR(" ERROR IN RECOVERING UV POINTER");
   2489 	}
   2490 
   2491 	DOMX_DEBUG("Port Number: %d :: NumOfLines %d", nPortIndex,
   2492 	    *nNumOfLines);
   2493 
   2494       EXIT:
   2495 	DOMX_EXIT("eError: %d", eError);
   2496 	return eError;
   2497 }
   2498 
   2499 
   2500 /* ===========================================================================*/
   2501 /**
   2502  * @name _RPC_IsProxyComponent()
   2503  * @brief This function calls GetComponentVersion API on the component and
   2504  *        based on the component name decidec whether the component is a proxy
   2505  *        or real component. The naming component convention assumed is
   2506  *        <OMX>.<Company Name>.<Core Name>.<Domain>.<Component Details> with
   2507  *        all characters in upper case for e.g. OMX.TI.DUCATI1.VIDEO.H264E
   2508  * @param hComponent [IN] : The component handle
   2509  *        bIsProxy [OUT]  : Set to true is handle is for a proxy component
   2510  * @return OMX_ErrorNone = Successful
   2511  *
   2512  **/
   2513 /* ===========================================================================*/
   2514 OMX_ERRORTYPE _RPC_IsProxyComponent(OMX_HANDLETYPE hComponent,
   2515     OMX_BOOL * bIsProxy)
   2516 {
   2517 	OMX_ERRORTYPE eError = OMX_ErrorNone;
   2518 	OMX_S8 cComponentName[MAXNAMESIZE] = { 0 }
   2519 	, cCoreName[32] =
   2520 	{
   2521 	0};
   2522 	OMX_VERSIONTYPE sCompVer, sSpecVer;
   2523 	OMX_UUIDTYPE sCompUUID;
   2524 	OMX_U32 i = 0, ret = 0;
   2525 
   2526 	eError =
   2527 	    OMX_GetComponentVersion(hComponent, (OMX_STRING) cComponentName,
   2528 	    &sCompVer, &sSpecVer, &sCompUUID);
   2529 	PROXY_assert(eError == OMX_ErrorNone, eError, "");
   2530 	ret =
   2531 	    sscanf((char *)cComponentName, "%*[^'.'].%*[^'.'].%[^'.'].%*s",
   2532 	    cCoreName);
   2533 	PROXY_assert(ret == 1, OMX_ErrorBadParameter,
   2534 	    "Incorrect component name");
   2535 	for (i = 0; i < CORE_MAX; i++)
   2536 	{
   2537 		if (strcmp((char *)cCoreName, Core_Array[i]) == 0)
   2538 			break;
   2539 	}
   2540 	PROXY_assert(i < CORE_MAX, OMX_ErrorBadParameter,
   2541 	    "Unknown core name");
   2542 
   2543 	/* If component name indicates remote core, it means proxy
   2544 	   component */
   2545 	if ((i == CORE_SYSM3) || (i == CORE_APPM3) || (i == CORE_TESLA))
   2546 		*bIsProxy = OMX_TRUE;
   2547 	else
   2548 		*bIsProxy = OMX_FALSE;
   2549 
   2550       EXIT:
   2551 	return eError;
   2552 }
   2553