/* ===========================================================================*/
RPC_OMX_ERRORTYPE RPC_SKEL_EventHandler(void *data)
{
	OMX_HANDLETYPE hComp;
	RPC_OMX_ERRORTYPE tRPCError = RPC_OMX_ErrorNone;
	OMX_COMPONENTTYPE *pHandle = NULL;
	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
	OMX_EVENTTYPE eEvent;
	OMX_U32 nData1;
	OMX_U32 nData2;
	OMX_PTR pEventData;
	OMX_U32 nPos = 0;
	//RPC_OMX_MESSAGE *recdMsg;
	OMX_U8 *pMsgBody = NULL;
	//recdMsg = (RPC_OMX_MESSAGE *) (data);
	pMsgBody = data;	//&recdMsg->msgBody[0];

	DOMX_ENTER("");

	//Marshalled:[>hComp|>eEvent|>nData1|>nData2|>pEventData]

	RPC_GETFIELDVALUE(pMsgBody, nPos, hComp, OMX_HANDLETYPE);
	pHandle = (OMX_COMPONENTTYPE *) hComp;
	pCompPrv = (PROXY_COMPONENT_PRIVATE *) pHandle->pComponentPrivate;

	RPC_GETFIELDVALUE(pMsgBody, nPos, eEvent, OMX_EVENTTYPE);
	RPC_GETFIELDVALUE(pMsgBody, nPos, nData1, OMX_U32);
	RPC_GETFIELDVALUE(pMsgBody, nPos, nData2, OMX_U32);
	RPC_GETFIELDVALUE(pMsgBody, nPos, pEventData, OMX_PTR);

	DOMX_DEBUG
	    ("\n**__**Got eventhandler from Remote Core succesffuly - values are : **__**");
	DOMX_DEBUG
	    ("hComp :0x%x,eEvent: 0x%x,nData1: 0x%x,nData2: 0x%x,pEventData: 0x%x",
	    hComp, eEvent, nData1, nData2, pEventData);
	DOMX_DEBUG("Just Before Entering Proxy Event handler call");

	tRPCError =
	    pCompPrv->proxyEventHandler(hComp, pCompPrv->pILAppData, eEvent,
	    nData1, nData2, pEventData);

	DOMX_EXIT("");
	return tRPCError;

}
/* ===========================================================================*/
RPC_OMX_ERRORTYPE RPC_SKEL_EmptyBufferDone(void *data)
{

	OMX_HANDLETYPE hComp;
	RPC_OMX_ERRORTYPE tRPCError = RPC_OMX_ErrorNone;
	OMX_U32 nfilledLen = 0;
	OMX_U32 nOffset = 0;
	OMX_U32 nFlags = 0;
	OMX_U32 bufferHdr;
	OMX_COMPONENTTYPE *pHandle = NULL;
	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
	OMX_U32 nPos = 0;
	//RPC_OMX_MESSAGE *recdMsg;
	OMX_U8 *pMsgBody = NULL;
	//recdMsg = (RPC_OMX_MESSAGE *) (data);

	pMsgBody = data;	//&recdMsg->msgBody[0];

	DOMX_ENTER("");

	//Marshalled:[>hComp|>bufferHdr|>nFilledLen|>nOffset|>nFlags]

	RPC_GETFIELDVALUE(pMsgBody, nPos, hComp, OMX_HANDLETYPE);
	pHandle = (OMX_COMPONENTTYPE *) hComp;
	pCompPrv = (PROXY_COMPONENT_PRIVATE *) pHandle->pComponentPrivate;

	RPC_GETFIELDVALUE(pMsgBody, nPos, bufferHdr, OMX_U32);

	RPC_GETFIELDVALUE(pMsgBody, nPos, nfilledLen, OMX_U32);
	RPC_GETFIELDVALUE(pMsgBody, nPos, nOffset, OMX_U32);
	RPC_GETFIELDVALUE(pMsgBody, nPos, nFlags, OMX_U32);

	tRPCError =
	    pCompPrv->proxyEmptyBufferDone(hComp, bufferHdr, nfilledLen,
	    nOffset, nFlags);

	DOMX_EXIT("");
	return tRPCError;
}
/* ===========================================================================*/
RPC_OMX_ERRORTYPE RPC_AllocateBuffer(RPC_OMX_HANDLE hRPCCtx,
    OMX_INOUT OMX_BUFFERHEADERTYPE ** ppBufferHdr, OMX_IN OMX_U32 nPortIndex,
    OMX_U32 * pBufHeaderRemote, OMX_U32 * pBufferMapped, OMX_PTR pAppPrivate,
    OMX_U32 nSizeBytes, OMX_ERRORTYPE * eCompReturn)
{
	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
	RcmClient_Message *pPacket = NULL;
	RcmClient_Message *pRetPacket = NULL;
	OMX_U32 nPacketSize = PACKET_SIZE;
	RPC_OMX_MESSAGE *pRPCMsg = NULL;
	RPC_OMX_BYTE *pMsgBody;
	RPC_INDEX fxnIdx;
	OMX_U32 nPos = 0;
	OMX_S16 status;
	RPC_OMX_CONTEXT *hCtx = hRPCCtx;
	RPC_OMX_HANDLE hComp = hCtx->remoteHandle;

	OMX_U32 offset = 0;
	OMX_TI_PLATFORMPRIVATE *pPlatformPrivate = NULL;
	OMX_BUFFERHEADERTYPE *pBufferHdr = *ppBufferHdr;

	DOMX_ENTER("");

	RPC_exitOnDucatiFault();

	fxnIdx =
	    rpcHndl[TARGET_CORE_ID].rpcFxns[RPC_OMX_FXN_IDX_ALLOCATE_BUFFER].
	    rpcFxnIdx;

	RPC_getPacket(hCtx->ClientHndl[RCM_DEFAULT_CLIENT], nPacketSize,
	    pPacket);
	pRPCMsg = (RPC_OMX_MESSAGE *) (&pPacket->data);
	pMsgBody = &pRPCMsg->msgBody[0];

	//Marshalled:[>hComp|>nPortIndex|>pAppPrivate|>nSizeBytes|
	//<pBufHeaderRemote|<offset(BufHeaderRemotecontents)|<offset(platformprivate)|
	//<--BufHeaderRemotecontents--|!<--pPlatformPrivate--]

	RPC_SETFIELDVALUE(pMsgBody, nPos, hComp, RPC_OMX_HANDLE);
	RPC_SETFIELDVALUE(pMsgBody, nPos, nPortIndex, OMX_U32);
	RPC_SETFIELDVALUE(pMsgBody, nPos, pAppPrivate, OMX_PTR);
	RPC_SETFIELDVALUE(pMsgBody, nPos, nSizeBytes, OMX_U32);

	pPacket->poolId = hCtx->nPoolId;
	pPacket->jobId = hCtx->nJobId;
	RPC_sendPacket_sync(hCtx->ClientHndl[RCM_DEFAULT_CLIENT], pPacket,
	    fxnIdx, pRetPacket);
	pRPCMsg = (RPC_OMX_MESSAGE *) (&pRetPacket->data);
	pMsgBody = &pRPCMsg->msgBody[0];

	*eCompReturn = pRPCMsg->msgHeader.nOMXReturn;

	if (pRPCMsg->msgHeader.nOMXReturn == OMX_ErrorNone)
	{

		RPC_GETFIELDVALUE(pMsgBody, nPos, *pBufHeaderRemote, OMX_U32);

		RPC_GETFIELDOFFSET(pMsgBody, nPos, offset, OMX_U32);
		//save platform private before overwriting
		pPlatformPrivate = (*ppBufferHdr)->pPlatformPrivate;
		//RPC_GETFIELDCOPYTYPE(pMsgBody, offset, pBufferHdr, OMX_BUFFERHEADERTYPE);
		/*Copying each field of the header separately due to padding issues in
		   the buffer header structure */
		RPC_GETFIELDVALUE(pMsgBody, offset, pBufferHdr->nSize,
		    OMX_U32);
		RPC_GETFIELDVALUE(pMsgBody, offset, pBufferHdr->nVersion,
		    OMX_VERSIONTYPE);
		RPC_GETFIELDVALUE(pMsgBody, offset, pBufferHdr->pBuffer,
		    OMX_U8 *);
		RPC_GETFIELDVALUE(pMsgBody, offset, pBufferHdr->nAllocLen,
		    OMX_U32);
		RPC_GETFIELDVALUE(pMsgBody, offset, pBufferHdr->nFilledLen,
		    OMX_U32);
		RPC_GETFIELDVALUE(pMsgBody, offset, pBufferHdr->nOffset,
		    OMX_U32);
		RPC_GETFIELDVALUE(pMsgBody, offset, pBufferHdr->pAppPrivate,
		    OMX_PTR);
		RPC_GETFIELDVALUE(pMsgBody, offset,
		    pBufferHdr->pPlatformPrivate, OMX_PTR);
		RPC_GETFIELDVALUE(pMsgBody, offset,
		    pBufferHdr->pInputPortPrivate, OMX_PTR);
		RPC_GETFIELDVALUE(pMsgBody, offset,
		    pBufferHdr->pOutputPortPrivate, OMX_PTR);
		RPC_GETFIELDVALUE(pMsgBody, offset,
		    pBufferHdr->hMarkTargetComponent, OMX_HANDLETYPE);
		RPC_GETFIELDVALUE(pMsgBody, offset, pBufferHdr->pMarkData,
		    OMX_PTR);
		RPC_GETFIELDVALUE(pMsgBody, offset, pBufferHdr->nTickCount,
		    OMX_U32);
		RPC_GETFIELDVALUE(pMsgBody, offset, pBufferHdr->nTimeStamp,
		    OMX_TICKS);
		RPC_GETFIELDVALUE(pMsgBody, offset, pBufferHdr->nFlags,
		    OMX_U32);
		RPC_GETFIELDVALUE(pMsgBody, offset,
		    pBufferHdr->nInputPortIndex, OMX_U32);
		RPC_GETFIELDVALUE(pMsgBody, offset,
		    pBufferHdr->nOutputPortIndex, OMX_U32);

		(*ppBufferHdr)->pPlatformPrivate = pPlatformPrivate;

#ifdef TILER_BUFF
		DOMX_DEBUG(" Copying plat pvt. ");
		RPC_GETFIELDOFFSET(pMsgBody, nPos, offset, OMX_U32);
		if (offset != 0)
		{
			RPC_GETFIELDCOPYTYPE(pMsgBody, offset,
			    (OMX_TI_PLATFORMPRIVATE
				*) ((*ppBufferHdr)->pPlatformPrivate),
			    OMX_TI_PLATFORMPRIVATE);
			DOMX_DEBUG("Done copying plat pvt., aux buf = 0x%x",
			    ((OMX_TI_PLATFORMPRIVATE
				    *) ((*ppBufferHdr)->
				    pPlatformPrivate))->pAuxBuf1);
		}
#endif

		*pBufferMapped = (OMX_U32) (*ppBufferHdr)->pBuffer;
	} else
/* ===========================================================================*/
RPC_OMX_ERRORTYPE RPC_GetHandle(RPC_OMX_HANDLE hRPCCtx,
    OMX_STRING cComponentName, OMX_PTR pAppData,
    OMX_CALLBACKTYPE * pCallBacks, OMX_ERRORTYPE * eCompReturn)
{
	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
	RPC_OMX_MESSAGE *pRPCMsg = NULL;
	RPC_OMX_BYTE *pMsgBody = NULL;
	OMX_U32 dataOffset = 0;
	OMX_U32 dataOffset2 = 0;
	OMX_U32 offset = 0;
	OMX_U32 nPacketSize = PACKET_SIZE;
	RcmClient_Message *pPacket = NULL;
	RcmClient_Message *pRetPacket = NULL;
	OMX_U32 nPos = 0;
	RPC_OMX_CONTEXT *hCtx = hRPCCtx;
	RPC_OMX_HANDLE hComp = NULL;
	OMX_HANDLETYPE hActualComp = NULL;

	OMX_S16 status;
	RPC_INDEX fxnIdx;
	OMX_STRING CallingCorercmServerName;

	OMX_S32 pid = 0;	//For TILER memory allocation changes

	DOMX_ENTER("");
	DOMX_DEBUG("RPC_GetHandle: Recieved GetHandle request from %s",
	    cComponentName);

	RPC_exitOnDucatiFault();

	RPC_UTIL_GetLocalServerName(cComponentName,
	    &CallingCorercmServerName);
	DOMX_DEBUG(" RCM Server Name Calling on Current Core: %s",
	    CallingCorercmServerName);

	fxnIdx =
	    rpcHndl[TARGET_CORE_ID].rpcFxns[RPC_OMX_FXN_IDX_GET_HANDLE].
	    rpcFxnIdx;

	//Allocating remote command message
	RPC_getPacket(hCtx->ClientHndl[RCM_DEFAULT_CLIENT], nPacketSize,
	    pPacket);
	pRPCMsg = (RPC_OMX_MESSAGE *) (&pPacket->data);
	pMsgBody = &pRPCMsg->msgBody[0];

	//Marshalled:[>offset(cParameterName)|>pAppData|>offset(CallingCorercmServerName)|>pid|
	//>--cComponentName--|>--CallingCorercmServerName--|
	//<hComp]

	dataOffset =
	    sizeof(OMX_U32) + sizeof(OMX_PTR) + sizeof(OMX_U32) +
	    sizeof(OMX_S32);
	RPC_SETFIELDOFFSET(pMsgBody, nPos, dataOffset, OMX_U32);
	//To update with RPC macros
	strcpy((char *)(pMsgBody + dataOffset), cComponentName);

	RPC_SETFIELDVALUE(pMsgBody, nPos, pAppData, OMX_PTR);

	dataOffset2 = dataOffset + 128;	//max size of omx comp name
	RPC_SETFIELDOFFSET(pMsgBody, nPos, dataOffset2, OMX_U32);
	//To update with RPC macros
	strcpy((char *)(pMsgBody + dataOffset2), CallingCorercmServerName);

	//Towards TILER memory allocation changes
	pid = getpid();
	RPC_SETFIELDVALUE(pMsgBody, nPos, pid, OMX_S32);

	pPacket->poolId = hCtx->nPoolId;
	pPacket->jobId = hCtx->nJobId;

	RPC_sendPacket_sync(hCtx->ClientHndl[RCM_DEFAULT_CLIENT], pPacket,
	    fxnIdx, pRetPacket);

	pRPCMsg = (RPC_OMX_MESSAGE *) (&pRetPacket->data);
	pMsgBody = &pRPCMsg->msgBody[0];

	*eCompReturn = pRPCMsg->msgHeader.nOMXReturn;

	if (*eCompReturn == OMX_ErrorNone)
	{
		offset = dataOffset2 + 32;	//max size of rcm server name
		RPC_GETFIELDVALUE(pMsgBody, offset, hComp, RPC_OMX_HANDLE);
		DOMX_DEBUG("Received Remote Handle 0x%x", hComp);
		hCtx->remoteHandle = hComp;
		/* The handle received above is used for all communications
		   with the remote component but is not the actual component
		   handle (it is actually the rpc context handle which
		   contains lot of other info). The handle recd. below is the
		   actual remote component handle. This is used at present for
		   mark buffer implementation since in that case it is not
		   feasible to send the context handle */
		RPC_GETFIELDVALUE(pMsgBody, offset, hActualComp,
		    OMX_HANDLETYPE);
		hCtx->hActualRemoteCompHandle = hActualComp;
	}

	RPC_freePacket(hCtx->ClientHndl[RCM_DEFAULT_CLIENT], pRetPacket);

      EXIT:
	DOMX_EXIT("");
	return eRPCError;
}