summaryrefslogtreecommitdiffstats
path: root/domx/domx/omx_rpc/src/omx_rpc_stub.c
diff options
context:
space:
mode:
Diffstat (limited to 'domx/domx/omx_rpc/src/omx_rpc_stub.c')
-rwxr-xr-xdomx/domx/omx_rpc/src/omx_rpc_stub.c1489
1 files changed, 1489 insertions, 0 deletions
diff --git a/domx/domx/omx_rpc/src/omx_rpc_stub.c b/domx/domx/omx_rpc/src/omx_rpc_stub.c
new file mode 100755
index 0000000..0c28ba1
--- /dev/null
+++ b/domx/domx/omx_rpc/src/omx_rpc_stub.c
@@ -0,0 +1,1489 @@
+/*
+ * Copyright (c) 2010, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of Texas Instruments Incorporated nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file omx_rpc_stub.c
+ * This file contains methods that provides the functionality for
+ * the OpenMAX1.1 DOMX Framework RPC Stub implementations.
+ *
+ * @path \WTSD_DucatiMMSW\framework\domx\omx_rpc\src
+ *
+ * @rev 1.0
+ */
+
+/*==============================================================
+ *! Revision History
+ *! ============================
+ *! 30-Apr-2010 Abhishek Ranka : Fixed GetExtension issue
+ *!
+ *! 29-Mar-2010 Abhishek Ranka : Revamped DOMX implementation
+ *!
+ *! 19-August-2009 B Ravi Kiran ravi.kiran@ti.com: Initial Version
+ *================================================================*/
+/******************************************************************
+ * INCLUDE FILES
+ ******************************************************************/
+#include <errno.h>
+#include <string.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include "omx_rpc.h"
+#include "omx_rpc_utils.h"
+#include "omx_proxy_common.h"
+#include "omx_rpc_stub.h"
+#include <OMX_TI_Common.h>
+#include <timm_osal_interfaces.h>
+
+#include <linux/rpmsg_omx.h>
+#include "rpmsg_omx_defs.h"
+
+/******************************************************************
+ * EXTERNS
+ ******************************************************************/
+
+/******************************************************************
+ * MACROS - LOCAL
+ ******************************************************************/
+
+//#define RPC_MSGPIPE_SIZE (4)
+#define RPC_MSG_SIZE_FOR_PIPE (sizeof(OMX_PTR))
+
+/* When this is defined ETB/FTB calls are made in sync mode. Undefining will
+ * result in these calls being sent via async mode. Sync mode leads to correct
+ * functionality as per OMX spec but has a slight performance penalty. Async
+ * mode sacrifices strict adherence to spec for some gain in performance. */
+#define RPC_SYNC_MODE
+
+
+#define RPC_getPacket(nPacketSize, pPacket) do { \
+ pPacket = TIMM_OSAL_Malloc(nPacketSize, TIMM_OSAL_TRUE, 0, TIMMOSAL_MEM_SEGMENT_INT); \
+ RPC_assert(pPacket != NULL, RPC_OMX_ErrorInsufficientResources, \
+ "Error Allocating RCM Message Frame"); \
+ TIMM_OSAL_Memset(pPacket, 0, nPacketSize); \
+ } while(0)
+
+#define RPC_freePacket(pPacket) do { \
+ if(pPacket != NULL) TIMM_OSAL_Free(pPacket); \
+ } while(0)
+
+#define RPC_sendPacket_sync(hCtx, pPacket, nPacketSize, nFxnIdx, pRetPacket, nSize) do { \
+ status = write(hCtx->fd_omx, pPacket, nPacketSize); \
+ RPC_freePacket(pPacket); \
+ pPacket = NULL; \
+ if(status < 0 && errno == ENXIO) { \
+ RPC_assert(0, RPC_OMX_ErrorHardware, "Write failed - Ducati in faulty state"); \
+ } \
+ if(status != (signed)nPacketSize) { \
+ DOMX_ERROR("Write failed returning status = 0x%x",status); \
+ RPC_assert(0, RPC_OMX_ErrorUndefined, "Write failed"); \
+ } \
+ eError = TIMM_OSAL_ReadFromPipe(hCtx->pMsgPipe[nFxnIdx], &pRetPacket, \
+ RPC_MSG_SIZE_FOR_PIPE, (TIMM_OSAL_U32 *)(&nSize), TIMM_OSAL_SUSPEND); \
+ RPC_assert(eError == TIMM_OSAL_ERR_NONE, eError, \
+ "Read failed"); \
+ } while(0)
+
+/*Set bit 31 on fxn idx as it is static function*/
+#define RPC_initPacket(pPacket, pOmxPacket, pData, nFxnIdx, nPacketSize) do { \
+ pOmxPacket = (struct omx_packet *)pPacket; \
+ pData = pOmxPacket->data; \
+ pOmxPacket->desc |= OMX_DESC_MSG << OMX_DESC_TYPE_SHIFT; \
+ pOmxPacket->msg_id = 0; \
+ pOmxPacket->flags = OMX_POOLID_JOBID_DEFAULT; \
+ pOmxPacket->fxn_idx = (nFxnIdx | 0x80000000); \
+ pOmxPacket->result = 0; \
+ pOmxPacket->data_size = nPacketSize; \
+ } while(0)
+
+//Async to be checked later - most probably same as sync but without the read
+#if 0
+
+#define RPC_sendPacket_async(HRCM, pPacket, nFxnIdx) do { \
+ pPacket->nFxnIdx = nFxnIdx; \
+ status = RcmClient_execCmd(HRCM, pPacket); \
+ if(status < 0) { \
+ RPC_freePacket(HRCM, pPacket); \
+ pPacket = NULL; \
+ RPC_assert(0, RPC_OMX_RCM_ErrorExecFail, \
+ "RcmClient_exec failed"); \
+ } \
+ } while(0)
+
+#define RPC_checkAsyncErrors(rcmHndl, pPacket) do { \
+ status = RcmClient_checkForError(rcmHndl, &pPacket); \
+ if(status < 0) { \
+ RPC_freePacket(rcmHndl, pPacket); \
+ pPacket = NULL; \
+ } \
+ RPC_assert(status >= 0, RPC_OMX_RCM_ClientFail, \
+ "Async error check returned error"); \
+ } while(0)
+
+#endif
+/* ===========================================================================*/
+/**
+ * @name RPC_GetHandle()
+ * @brief Remote invocation stub for OMX_GetHandle
+ * @param hRPCCtx [OUT] : The RPC context handle.
+ * @param cComponentName [IN] : Name of the component that is to be created
+ * on Remote core.
+ * @param pAppData [IN] : The AppData passed by the user.
+ * @param pCallBacks [IN] : The callback pointers passed by the caller.
+ * @param eCompReturn [OUT] : This is return value returned by the remote
+ * component.
+ * @return RPC_OMX_ErrorNone = Successful
+ */
+/* ===========================================================================*/
+RPC_OMX_ERRORTYPE RPC_GetHandle(OMX_HANDLETYPE hRPCCtx,
+ OMX_STRING cComponentName, OMX_PTR pAppData,
+ OMX_CALLBACKTYPE * pCallBacks, OMX_ERRORTYPE * eCompReturn)
+{
+ RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
+ TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
+ OMX_U32 nPacketSize = RPC_PACKET_SIZE;
+ TIMM_OSAL_PTR pPacket = NULL, pRetPacket = NULL, pData =
+ NULL, pRetData = NULL;
+ OMX_U32 nPos = 0, nSize = 0, nOffset = 0;
+ RPC_OMX_CONTEXT *hCtx = hRPCCtx;
+ OMX_HANDLETYPE hComp = NULL;
+ OMX_HANDLETYPE hActualComp = NULL;
+ OMX_S32 status = 0;
+ RPC_OMX_FXN_IDX_TYPE nFxnIdx;
+ struct omx_packet *pOmxPacket = NULL;
+
+ DOMX_ENTER("");
+ DOMX_DEBUG("RPC_GetHandle: Recieved GetHandle request from %s",
+ cComponentName);
+
+ nFxnIdx = RPC_OMX_FXN_IDX_GET_HANDLE;
+ RPC_getPacket(nPacketSize, pPacket);
+ RPC_initPacket(pPacket, pOmxPacket, pData, nFxnIdx, nPacketSize);
+
+ DOMX_DEBUG("Packing data");
+ /*No buffer mapping required */
+ RPC_SETFIELDVALUE(pData, nPos, RPC_OMX_MAP_INFO_NONE,
+ RPC_OMX_MAP_INFO_TYPE);
+ RPC_SETFIELDVALUE(pData, nPos, nOffset, OMX_U32);
+
+ RPC_SETFIELDCOPYGEN(pData, nPos, cComponentName,
+ OMX_MAX_STRINGNAME_SIZE);
+ RPC_SETFIELDVALUE(pData, nPos, pAppData, OMX_PTR);
+
+ DOMX_DEBUG("Sending data");
+ RPC_sendPacket_sync(hCtx, pPacket, nPacketSize, nFxnIdx, pRetPacket,
+ nSize);
+
+ *eCompReturn = (OMX_ERRORTYPE) (((struct omx_packet *) pRetPacket)->result);
+
+ if (*eCompReturn == OMX_ErrorNone)
+ {
+ pRetData = ((struct omx_packet *) pRetPacket)->data;
+ RPC_GETFIELDVALUE(pRetData, nPos, hComp, OMX_HANDLETYPE);
+ DOMX_DEBUG("Remote Handle 0x%x", hComp);
+ hCtx->hRemoteHandle = 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(pRetData, nPos, hActualComp,
+ OMX_HANDLETYPE);
+ DOMX_DEBUG("Actual Remote Comp Handle 0x%x", hActualComp);
+ hCtx->hActualRemoteCompHandle = hActualComp;
+ }
+
+ /* Save context information */
+ hCtx->pAppData = pAppData;
+
+ EXIT:
+ if (pPacket)
+ RPC_freePacket(pPacket);
+ if (pRetPacket && *eCompReturn != OMX_ErrorHardware)
+ RPC_freePacket(pRetPacket);
+
+ DOMX_EXIT("");
+ return eRPCError;
+}
+
+
+
+/* ===========================================================================*/
+/**
+ * @name RPC_FreeHandle()
+ * @brief Remote invocation stub for OMX_FreeHandle
+ * @param hRPCCtx [IN] : The RPC context handle.
+ * @param eCompReturn [OUT] : Return value returned by the remote component.
+ * @return RPC_OMX_ErrorNone = Successful
+ */
+/* ===========================================================================*/
+RPC_OMX_ERRORTYPE RPC_FreeHandle(OMX_HANDLETYPE hRPCCtx,
+ OMX_ERRORTYPE * eCompReturn)
+{
+ RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
+ TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
+ OMX_U32 nPacketSize = RPC_PACKET_SIZE;
+ TIMM_OSAL_PTR pPacket = NULL, pRetPacket = NULL, pData = NULL;
+ OMX_S32 status = 0;
+ RPC_OMX_FXN_IDX_TYPE nFxnIdx;
+ OMX_U32 nPos = 0, nSize = 0, nOffset = 0;
+ RPC_OMX_CONTEXT *hCtx = hRPCCtx;
+ OMX_HANDLETYPE hComp = hCtx->hRemoteHandle;
+ struct omx_packet *pOmxPacket = NULL;
+
+ DOMX_ENTER("");
+
+ nFxnIdx = RPC_OMX_FXN_IDX_FREE_HANDLE;
+ RPC_getPacket(nPacketSize, pPacket);
+ RPC_initPacket(pPacket, pOmxPacket, pData, nFxnIdx, nPacketSize);
+
+ /*No buffer mapping required */
+ RPC_SETFIELDVALUE(pData, nPos, RPC_OMX_MAP_INFO_NONE,
+ RPC_OMX_MAP_INFO_TYPE);
+ RPC_SETFIELDVALUE(pData, nPos, nOffset, OMX_U32);
+
+ RPC_SETFIELDVALUE(pData, nPos, hComp, OMX_HANDLETYPE);
+
+ RPC_sendPacket_sync(hCtx, pPacket, nPacketSize, nFxnIdx, pRetPacket,
+ nSize);
+
+ *eCompReturn = (OMX_ERRORTYPE) (((struct omx_packet *) pRetPacket)->result);
+
+ EXIT:
+ if (pPacket)
+ RPC_freePacket(pPacket);
+ if (pRetPacket && *eCompReturn != OMX_ErrorHardware)
+ RPC_freePacket(pRetPacket);
+
+ DOMX_EXIT("");
+ return eRPCError;
+
+}
+
+
+
+/* ===========================================================================*/
+/**
+ * @name RPC_SetParameter()
+ * @brief Remote invocation stub for OMX_SetParameter
+ * @param hRPCCtx [IN] : The RPC context handle.
+ * @param nParamIndex [IN] : Same as nParamIndex received at the proxy.
+ * @param pCompParam [IN] : Same as pCompParam recieved at the proxy.
+ * @param eCompReturn [OUT] : Return value returned by the remote component.
+ * @return RPC_OMX_ErrorNone = Successful
+ */
+/* ===========================================================================*/
+RPC_OMX_ERRORTYPE RPC_SetParameter(OMX_HANDLETYPE hRPCCtx,
+ OMX_INDEXTYPE nParamIndex, OMX_PTR pCompParam,
+ OMX_PTR pLocBufNeedMap, OMX_U32 nNumOfLocalBuf, OMX_ERRORTYPE * eCompReturn)
+{
+
+ RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
+ TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
+ TIMM_OSAL_PTR pPacket = NULL, pRetPacket = NULL, pData = NULL;
+ OMX_U32 nPacketSize = RPC_PACKET_SIZE;
+ RPC_OMX_FXN_IDX_TYPE nFxnIdx;
+ OMX_U32 nPos = 0, nSize = 0, nOffset = 0;
+ OMX_S32 status = 0;
+ RPC_OMX_CONTEXT *hCtx = hRPCCtx;
+ OMX_HANDLETYPE hComp = hCtx->hRemoteHandle;
+ OMX_U32 structSize = 0;
+ struct omx_packet *pOmxPacket = NULL;
+
+ nFxnIdx = RPC_OMX_FXN_IDX_SET_PARAMETER;
+ RPC_getPacket(nPacketSize, pPacket);
+ RPC_initPacket(pPacket, pOmxPacket, pData, nFxnIdx, nPacketSize);
+
+ if (pLocBufNeedMap != NULL && (pLocBufNeedMap - pCompParam) >= 0 ) {
+ if (nNumOfLocalBuf == 1) {
+ RPC_SETFIELDVALUE(pData, nPos, RPC_OMX_MAP_INFO_ONE_BUF,
+ RPC_OMX_MAP_INFO_TYPE);
+ }
+ else if (nNumOfLocalBuf == 2) {
+ RPC_SETFIELDVALUE(pData, nPos, RPC_OMX_MAP_INFO_TWO_BUF,
+ RPC_OMX_MAP_INFO_TYPE);
+ }
+ nOffset = (pLocBufNeedMap - pCompParam) +
+ sizeof(RPC_OMX_MAP_INFO_TYPE) + sizeof(OMX_U32) +
+ sizeof(OMX_HANDLETYPE) + sizeof(OMX_INDEXTYPE);
+ } else {
+ /*No buffer mapping required */
+ RPC_SETFIELDVALUE(pData, nPos, RPC_OMX_MAP_INFO_NONE,
+ RPC_OMX_MAP_INFO_TYPE);
+ }
+
+ RPC_SETFIELDVALUE(pData, nPos, nOffset, OMX_U32);
+
+ RPC_SETFIELDVALUE(pData, nPos, hComp, OMX_HANDLETYPE);
+ RPC_SETFIELDVALUE(pData, nPos, nParamIndex, OMX_INDEXTYPE);
+ structSize = RPC_UTIL_GETSTRUCTSIZE(pCompParam);
+ RPC_SETFIELDCOPYGEN(pData, nPos, pCompParam, structSize);
+
+ RPC_sendPacket_sync(hCtx, pPacket, nPacketSize, nFxnIdx, pRetPacket,
+ nSize);
+
+ *eCompReturn = (OMX_ERRORTYPE) (((struct omx_packet *) pRetPacket)->result);
+
+ EXIT:
+ if (pPacket)
+ RPC_freePacket(pPacket);
+ if (pRetPacket && *eCompReturn != OMX_ErrorHardware)
+ RPC_freePacket(pRetPacket);
+
+ DOMX_EXIT("");
+ return eRPCError;
+}
+
+
+
+/* ===========================================================================*/
+/**
+ * @name RPC_GetParameter()
+ * @brief Remote invocation stub for OMX_GetParameter
+ * @param hRPCCtx [IN] : The RPC context handle.
+ * @param nParamIndex [IN] : Same as nParamIndex received at the proxy.
+ * @param pCompParam [IN] : Same as pCompParam recieved at the proxy.
+ * @param eCompReturn [OUT] : Return value returned by the remote component.
+ * @return RPC_OMX_ErrorNone = Successful
+ */
+/* ===========================================================================*/
+RPC_OMX_ERRORTYPE RPC_GetParameter(OMX_HANDLETYPE hRPCCtx,
+ OMX_INDEXTYPE nParamIndex, OMX_PTR pCompParam,
+ OMX_PTR pLocBufNeedMap, OMX_ERRORTYPE * eCompReturn)
+{
+ RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
+ TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
+ TIMM_OSAL_PTR pPacket = NULL, pRetPacket = NULL, pData =
+ NULL, pRetData = NULL;
+ OMX_U32 nPacketSize = RPC_PACKET_SIZE;
+ RPC_OMX_FXN_IDX_TYPE nFxnIdx;
+ OMX_U32 nPos = 0, nSize = 0, nDataOffset = 0, nOffset = 0;
+ OMX_S32 status = 0;
+ RPC_OMX_CONTEXT *hCtx = hRPCCtx;
+ OMX_HANDLETYPE hComp = hCtx->hRemoteHandle;
+ OMX_U32 structSize = 0;
+ struct omx_packet *pOmxPacket = NULL;
+
+ DOMX_ENTER("");
+
+ nFxnIdx = RPC_OMX_FXN_IDX_GET_PARAMETER;
+ RPC_getPacket(nPacketSize, pPacket);
+ RPC_initPacket(pPacket, pOmxPacket, pData, nFxnIdx, nPacketSize);
+
+ if (pLocBufNeedMap != NULL && (pLocBufNeedMap - pCompParam) >= 0 ) {
+ RPC_SETFIELDVALUE(pData, nPos, RPC_OMX_MAP_INFO_ONE_BUF,
+ RPC_OMX_MAP_INFO_TYPE);
+ nOffset = (pLocBufNeedMap - pCompParam) +
+ sizeof(RPC_OMX_MAP_INFO_TYPE) + sizeof(OMX_U32) +
+ sizeof(OMX_HANDLETYPE) + sizeof(OMX_INDEXTYPE);
+ } else {
+ /*No buffer mapping required */
+ RPC_SETFIELDVALUE(pData, nPos, RPC_OMX_MAP_INFO_NONE,
+ RPC_OMX_MAP_INFO_TYPE);
+ }
+
+ RPC_SETFIELDVALUE(pData, nPos, nOffset, OMX_U32);
+
+ RPC_SETFIELDVALUE(pData, nPos, hComp, OMX_HANDLETYPE);
+ RPC_SETFIELDVALUE(pData, nPos, nParamIndex, OMX_INDEXTYPE);
+ nDataOffset = nPos;
+ structSize = RPC_UTIL_GETSTRUCTSIZE(pCompParam);
+ RPC_SETFIELDCOPYGEN(pData, nPos, pCompParam, structSize);
+
+ RPC_sendPacket_sync(hCtx, pPacket, nPacketSize, nFxnIdx, pRetPacket,
+ nSize);
+
+ *eCompReturn = (OMX_ERRORTYPE) (((struct omx_packet *) pRetPacket)->result);
+
+ if (*eCompReturn == OMX_ErrorNone)
+ {
+ pRetData = ((struct omx_packet *) pRetPacket)->data;
+ /*pCompParam is returned in the same location in which it was sent */
+ RPC_GETFIELDCOPYGEN(pRetData, nDataOffset, pCompParam,
+ structSize);
+ }
+
+ EXIT:
+ if (pPacket)
+ RPC_freePacket(pPacket);
+ //In case of Error Hardware this packet gets freed in omx_rpc.c
+ if (pRetPacket && *eCompReturn != OMX_ErrorHardware)
+ RPC_freePacket(pRetPacket);
+
+ DOMX_EXIT("");
+ return eRPCError;
+}
+
+
+
+/* ===========================================================================*/
+/**
+ * @name RPC_SetConfig()
+ * @brief Remote invocation stub for OMX_SetConfig
+ * @param hRPCCtx [IN] : The RPC context handle.
+ * @param nConfigIndex [IN] : Same as nConfigIndex received at the proxy.
+ * @param pCompConfig [IN] : Same as pCompConfig recieved at the proxy.
+ * @param eCompReturn [OUT] : Return value returned by the remote component.
+ * @return RPC_OMX_ErrorNone = Successful
+ */
+/* ===========================================================================*/
+RPC_OMX_ERRORTYPE RPC_SetConfig(OMX_HANDLETYPE hRPCCtx,
+ OMX_INDEXTYPE nConfigIndex, OMX_PTR pCompConfig,
+ OMX_PTR pLocBufNeedMap, OMX_ERRORTYPE * eCompReturn)
+{
+ RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
+ TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
+ TIMM_OSAL_PTR pPacket = NULL, pRetPacket = NULL, pData = NULL;
+ OMX_U32 nPacketSize = RPC_PACKET_SIZE;
+ RPC_OMX_FXN_IDX_TYPE nFxnIdx;
+ OMX_U32 nPos = 0, nSize = 0, nOffset = 0;
+ OMX_S32 status = 0;
+ RPC_OMX_CONTEXT *hCtx = hRPCCtx;
+ OMX_HANDLETYPE hComp = hCtx->hRemoteHandle;
+ OMX_U32 structSize = 0;
+ struct omx_packet *pOmxPacket = NULL;
+
+ DOMX_ENTER("");
+
+ nFxnIdx = RPC_OMX_FXN_IDX_SET_CONFIG;
+ RPC_getPacket(nPacketSize, pPacket);
+ RPC_initPacket(pPacket, pOmxPacket, pData, nFxnIdx, nPacketSize);
+
+ if (pLocBufNeedMap != NULL && (pLocBufNeedMap - pCompConfig) >= 0 ) {
+ RPC_SETFIELDVALUE(pData, nPos, RPC_OMX_MAP_INFO_ONE_BUF,
+ RPC_OMX_MAP_INFO_TYPE);
+ nOffset = (pLocBufNeedMap - pCompConfig) +
+ sizeof(RPC_OMX_MAP_INFO_TYPE) + sizeof(OMX_U32) +
+ sizeof(OMX_HANDLETYPE) + sizeof(OMX_INDEXTYPE);
+ } else {
+ /*No buffer mapping required */
+ RPC_SETFIELDVALUE(pData, nPos, RPC_OMX_MAP_INFO_NONE,
+ RPC_OMX_MAP_INFO_TYPE);
+ }
+
+ RPC_SETFIELDVALUE(pData, nPos, nOffset, OMX_U32);
+
+ RPC_SETFIELDVALUE(pData, nPos, hComp, OMX_HANDLETYPE);
+ RPC_SETFIELDVALUE(pData, nPos, nConfigIndex, OMX_INDEXTYPE);
+ structSize = RPC_UTIL_GETSTRUCTSIZE(pCompConfig);
+ RPC_SETFIELDCOPYGEN(pData, nPos, pCompConfig, structSize);
+
+ RPC_sendPacket_sync(hCtx, pPacket, nPacketSize, nFxnIdx, pRetPacket,
+ nSize);
+ *eCompReturn = (OMX_ERRORTYPE) (((struct omx_packet *) pRetPacket)->result);
+
+ EXIT:
+ if (pPacket)
+ RPC_freePacket(pPacket);
+ if (pRetPacket && *eCompReturn != OMX_ErrorHardware)
+ RPC_freePacket(pRetPacket);
+
+ DOMX_EXIT("");
+ return eRPCError;
+}
+
+/* ===========================================================================*/
+/**
+ * @name RPC_GetConfig()
+ * @brief Remote invocation stub for OMX_GetConfig
+ * @param hRPCCtx [IN] : The RPC context handle.
+ * @param nConfigIndex [IN] : Same as nConfigIndex received at the proxy.
+ * @param pCompConfig [IN] : Same as pCompConfig recieved at the proxy.
+ * @param eCompReturn [OUT] : Return value returned by the remote component.
+ * @return RPC_OMX_ErrorNone = Successful
+ */
+/* ===========================================================================*/
+RPC_OMX_ERRORTYPE RPC_GetConfig(OMX_HANDLETYPE hRPCCtx,
+ OMX_INDEXTYPE nConfigIndex, OMX_PTR pCompConfig,
+ OMX_PTR pLocBufNeedMap, OMX_ERRORTYPE * eCompReturn)
+{
+ RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
+ TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
+ TIMM_OSAL_PTR pPacket = NULL, pRetPacket = NULL, pData =
+ NULL, pRetData = NULL;
+ OMX_U32 nPacketSize = RPC_PACKET_SIZE;
+ RPC_OMX_FXN_IDX_TYPE nFxnIdx;
+ OMX_U32 nPos = 0, nSize = 0, nOffset = 0, nDataOffset = 0;
+ OMX_S32 status = 0;
+ RPC_OMX_CONTEXT *hCtx = hRPCCtx;
+ OMX_HANDLETYPE hComp = hCtx->hRemoteHandle;
+ OMX_U32 structSize = 0;
+ struct omx_packet *pOmxPacket = NULL;
+
+ DOMX_ENTER("");
+
+ nFxnIdx = RPC_OMX_FXN_IDX_GET_CONFIG;
+ RPC_getPacket(nPacketSize, pPacket);
+ RPC_initPacket(pPacket, pOmxPacket, pData, nFxnIdx, nPacketSize);
+
+ if (pLocBufNeedMap != NULL && (pLocBufNeedMap - pCompConfig) >= 0 ) {
+ RPC_SETFIELDVALUE(pData, nPos, RPC_OMX_MAP_INFO_ONE_BUF,
+ RPC_OMX_MAP_INFO_TYPE);
+ nOffset = (pLocBufNeedMap - pCompConfig) +
+ sizeof(RPC_OMX_MAP_INFO_TYPE) + sizeof(OMX_U32) +
+ sizeof(OMX_HANDLETYPE) + sizeof(OMX_INDEXTYPE);
+ } else {
+ /*No buffer mapping required */
+ RPC_SETFIELDVALUE(pData, nPos, RPC_OMX_MAP_INFO_NONE,
+ RPC_OMX_MAP_INFO_TYPE);
+ }
+
+ RPC_SETFIELDVALUE(pData, nPos, nOffset, OMX_U32);
+
+ RPC_SETFIELDVALUE(pData, nPos, hComp, OMX_HANDLETYPE);
+ RPC_SETFIELDVALUE(pData, nPos, nConfigIndex, OMX_INDEXTYPE);
+ nDataOffset = nPos;
+ structSize = RPC_UTIL_GETSTRUCTSIZE(pCompConfig);
+ RPC_SETFIELDCOPYGEN(pData, nPos, pCompConfig, structSize);
+
+ RPC_sendPacket_sync(hCtx, pPacket, nPacketSize, nFxnIdx, pRetPacket,
+ nSize);
+
+ *eCompReturn = (OMX_ERRORTYPE) (((struct omx_packet *) pRetPacket)->result);
+
+ if (*eCompReturn == RPC_OMX_ErrorNone)
+ {
+ pRetData = ((struct omx_packet *) pRetPacket)->data;
+ /*pCompParam is returned in the same location in which it was sent */
+ RPC_GETFIELDCOPYGEN(pRetData, nDataOffset, pCompConfig,
+ structSize);
+ }
+
+ EXIT:
+ if (pPacket)
+ RPC_freePacket(pPacket);
+ if (pRetPacket && *eCompReturn != OMX_ErrorHardware)
+ RPC_freePacket(pRetPacket);
+
+ DOMX_EXIT("");
+ return eRPCError;
+}
+
+
+
+/* ===========================================================================*/
+/**
+ * @name RPC_SendCommand()
+ * @brief Remote invocation stub for OMX_SendCommand
+ * @param hRPCCtx [IN] : The RPC context handle.
+ * @param eCmd [IN] : Same as eCmd received at the proxy.
+ * @param nParam [IN] : Same as nParam recieved at the proxy.
+ * @param pCmdData [IN] : Same as pCmdData recieved at the proxy.
+ * @param eCompReturn [OUT] : Return value returned by the remote component.
+ * @return RPC_OMX_ErrorNone = Successful
+ */
+/* ===========================================================================*/
+RPC_OMX_ERRORTYPE RPC_SendCommand(OMX_HANDLETYPE hRPCCtx,
+ OMX_COMMANDTYPE eCmd, OMX_U32 nParam, OMX_PTR pCmdData,
+ OMX_ERRORTYPE * eCompReturn)
+{
+ RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
+ TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
+ TIMM_OSAL_PTR pPacket = NULL, pRetPacket = NULL, pData = NULL;
+ OMX_U32 nPacketSize = RPC_PACKET_SIZE;
+ RPC_OMX_FXN_IDX_TYPE nFxnIdx;
+ OMX_U32 nPos = 0, nSize = 0, nOffset = 0;
+ OMX_S32 status = 0;
+ RPC_OMX_CONTEXT *hCtx = hRPCCtx;
+ OMX_HANDLETYPE hComp = hCtx->hRemoteHandle;
+ OMX_U32 structSize = 0;
+ struct omx_packet *pOmxPacket = NULL;
+
+ DOMX_ENTER("");
+
+ nFxnIdx = RPC_OMX_FXN_IDX_SEND_CMD;
+ RPC_getPacket(nPacketSize, pPacket);
+ RPC_initPacket(pPacket, pOmxPacket, pData, nFxnIdx, nPacketSize);
+
+ /*No buffer mapping required */
+ RPC_SETFIELDVALUE(pData, nPos, RPC_OMX_MAP_INFO_NONE,
+ RPC_OMX_MAP_INFO_TYPE);
+ RPC_SETFIELDVALUE(pData, nPos, nOffset, OMX_U32);
+
+ RPC_SETFIELDVALUE(pData, nPos, hComp, OMX_HANDLETYPE);
+ RPC_SETFIELDVALUE(pData, nPos, eCmd, OMX_COMMANDTYPE);
+ RPC_SETFIELDVALUE(pData, nPos, nParam, OMX_U32);
+
+ if (pCmdData != NULL && eCmd == OMX_CommandMarkBuffer)
+ {
+ /*The RPC_UTIL_GETSTRUCTSIZE will not work here since OMX_MARKTYPE structure
+ does not have nSize field */
+ structSize = sizeof(OMX_MARKTYPE);
+ RPC_SETFIELDCOPYGEN(pData, nPos, pCmdData, structSize);
+ } else if (pCmdData != NULL)
+ {
+ structSize = RPC_UTIL_GETSTRUCTSIZE(pCmdData);
+ RPC_SETFIELDCOPYGEN(pData, nPos, pCmdData, structSize);
+ }
+
+ RPC_sendPacket_sync(hCtx, pPacket, nPacketSize, nFxnIdx, pRetPacket,
+ nSize);
+
+ *eCompReturn = (OMX_ERRORTYPE) (((struct omx_packet *) pRetPacket)->result);
+
+ EXIT:
+ if (pPacket)
+ RPC_freePacket(pPacket);
+ if (pRetPacket && *eCompReturn != OMX_ErrorHardware)
+ RPC_freePacket(pRetPacket);
+
+ DOMX_EXIT("");
+ return eRPCError;
+}
+
+
+
+/* ===========================================================================*/
+/**
+ * @name RPC_GetState()
+ * @brief Remote invocation stub for OMX_GetState
+ * @param hRPCCtx [IN] : The RPC context handle.
+ * @param pState [OUT] : State variable, to be filled in and returned by
+ * the remote component..
+ * @param eCompReturn [OUT] : Return value returned by the remote component.
+ * @return RPC_OMX_ErrorNone = Successful
+ */
+/* ===========================================================================*/
+RPC_OMX_ERRORTYPE RPC_GetState(OMX_HANDLETYPE hRPCCtx, OMX_STATETYPE * pState,
+ OMX_ERRORTYPE * eCompReturn)
+{
+ RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
+ TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
+ TIMM_OSAL_PTR pPacket = NULL, pRetPacket = NULL, pData =
+ NULL, pRetData = NULL;
+ OMX_U32 nPacketSize = RPC_PACKET_SIZE;
+ RPC_OMX_FXN_IDX_TYPE nFxnIdx;
+ OMX_U32 nPos = 0, nSize = 0, nOffset = 0;
+ OMX_S32 status = 0;
+ RPC_OMX_CONTEXT *hCtx = hRPCCtx;
+ OMX_HANDLETYPE hComp = hCtx->hRemoteHandle;
+ struct omx_packet *pOmxPacket = NULL;
+
+ DOMX_ENTER("");
+
+ nFxnIdx = RPC_OMX_FXN_IDX_GET_STATE;
+ RPC_getPacket(nPacketSize, pPacket);
+ RPC_initPacket(pPacket, pOmxPacket, pData, nFxnIdx, nPacketSize);
+
+ /*No buffer mapping required */
+ RPC_SETFIELDVALUE(pData, nPos, RPC_OMX_MAP_INFO_NONE,
+ RPC_OMX_MAP_INFO_TYPE);
+ RPC_SETFIELDVALUE(pData, nPos, nOffset, OMX_U32);
+
+ RPC_SETFIELDVALUE(pData, nPos, hComp, OMX_HANDLETYPE);
+
+ RPC_sendPacket_sync(hCtx, pPacket, nPacketSize, nFxnIdx, pRetPacket,
+ nSize);
+
+ *eCompReturn = (OMX_ERRORTYPE) (((struct omx_packet *) pRetPacket)->result);
+
+ if (*eCompReturn == OMX_ErrorNone)
+ {
+ pRetData = ((struct omx_packet *) pRetPacket)->data;
+ RPC_GETFIELDCOPYTYPE(pRetData, nPos, pState, OMX_STATETYPE);
+ }
+
+ EXIT:
+ if (pPacket)
+ RPC_freePacket(pPacket);
+ if (pRetPacket && *eCompReturn != OMX_ErrorHardware)
+ RPC_freePacket(pRetPacket);
+
+ DOMX_EXIT("");
+ return eRPCError;
+}
+
+
+
+/* ===========================================================================*/
+/**
+ * @name RPC_GetComponentVersion()
+ * @brief Remote invocation stub for OMX_GetComponentVersion
+ * @param hRPCCtx [IN] : The RPC context handle.
+ * @param pComponentName [OUT] : Component name, to be filled in and returned
+ * by the remote component.
+ * @param pComponentVersion [OUT] : Component version info, to be filled in and
+ * returned by the remote component.
+ * @param pSpecVersion [OUT] : Spec version info, to be filled in and
+ * returned by the remote component.
+ * @param pComponentUUID [OUT] : Component UUID info, to be filled in and
+ * returned by the remote component (optional).
+ * @param eCompReturn [OUT] : Return value returned by the remote
+ * component.
+ * @return RPC_OMX_ErrorNone = Successful
+ */
+/* ===========================================================================*/
+RPC_OMX_ERRORTYPE RPC_GetComponentVersion(OMX_HANDLETYPE hRPCCtx,
+ OMX_STRING pComponentName, OMX_VERSIONTYPE * pComponentVersion,
+ OMX_VERSIONTYPE * pSpecVersion, OMX_UUIDTYPE * pComponentUUID,
+ OMX_ERRORTYPE * eCompReturn)
+{
+ RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
+ OMX_U32 nPacketSize = RPC_PACKET_SIZE;
+ TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
+ TIMM_OSAL_PTR pPacket = NULL, pRetPacket = NULL, pData =
+ NULL, pRetData = NULL;
+ OMX_S32 status = 0;
+ RPC_OMX_FXN_IDX_TYPE nFxnIdx;
+ OMX_U32 nPos = 0, nSize = 0, nOffset = 0;
+ RPC_OMX_CONTEXT *hCtx = hRPCCtx;
+ OMX_HANDLETYPE hComp = hCtx->hRemoteHandle;
+ struct omx_packet *pOmxPacket = NULL;
+
+ DOMX_ENTER("");
+
+ nFxnIdx = RPC_OMX_FXN_IDX_GET_VERSION;
+ RPC_getPacket(nPacketSize, pPacket);
+ RPC_initPacket(pPacket, pOmxPacket, pData, nFxnIdx, nPacketSize);
+
+ /*No buffer mapping required */
+ RPC_SETFIELDVALUE(pData, nPos, RPC_OMX_MAP_INFO_NONE,
+ RPC_OMX_MAP_INFO_TYPE);
+ RPC_SETFIELDVALUE(pData, nPos, nOffset, OMX_U32);
+
+ RPC_SETFIELDVALUE(pData, nPos, hComp, OMX_HANDLETYPE);
+
+ RPC_sendPacket_sync(hCtx, pPacket, nPacketSize, nFxnIdx, pRetPacket,
+ nSize);
+
+ *eCompReturn = (OMX_ERRORTYPE) (((struct omx_packet *) pRetPacket)->result);
+
+ if (*eCompReturn == OMX_ErrorNone)
+ {
+ pRetData = ((struct omx_packet *) pRetPacket)->data;
+ RPC_GETFIELDCOPYGEN(pRetData, nPos, pComponentName,
+ OMX_MAX_STRINGNAME_SIZE);
+ RPC_GETFIELDCOPYTYPE(pRetData, nPos, pComponentVersion,
+ OMX_VERSIONTYPE);
+ RPC_GETFIELDCOPYTYPE(pRetData, nPos, pSpecVersion,
+ OMX_VERSIONTYPE);
+ memcpy(pComponentUUID,(OMX_UUIDTYPE *)( (OMX_U32)pRetData + nPos), sizeof(OMX_UUIDTYPE));
+ }
+
+ EXIT:
+ if (pPacket)
+ RPC_freePacket(pPacket);
+ if (pRetPacket && *eCompReturn != OMX_ErrorHardware)
+ RPC_freePacket(pRetPacket);
+
+ return eRPCError;
+}
+
+
+
+/* ===========================================================================*/
+/**
+ * @name RPC_GetExtensionIndex()
+ * @brief Remote invocation stub for OMX_GetExtensionIndex
+ * @param hRPCCtx [IN] : The RPC context handle.
+ * @param cParameterName [IN] : The parameter name sent by the user.
+ * @param pIndexType [OUT] : Index type returned by the remote component.
+ * @param eCompReturn [OUT] : Return value returned by the remote component.
+ * @return RPC_OMX_ErrorNone = Successful
+ */
+/* ===========================================================================*/
+RPC_OMX_ERRORTYPE RPC_GetExtensionIndex(OMX_HANDLETYPE hRPCCtx,
+ OMX_STRING cParameterName, OMX_INDEXTYPE * pIndexType,
+ OMX_ERRORTYPE * eCompReturn)
+{
+
+ RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
+ OMX_U32 nPos = 0, nSize = 0, nOffset = 0;
+ RPC_OMX_CONTEXT *hCtx = hRPCCtx;
+ OMX_HANDLETYPE hComp = hCtx->hRemoteHandle;
+ OMX_U32 nPacketSize = RPC_PACKET_SIZE;
+ TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
+ TIMM_OSAL_PTR pPacket = NULL, pRetPacket = NULL, pData =
+ NULL, pRetData = NULL;
+ OMX_S32 status = 0;
+ RPC_OMX_FXN_IDX_TYPE nFxnIdx;
+ struct omx_packet *pOmxPacket = NULL;
+
+ nFxnIdx = RPC_OMX_FXN_IDX_GET_EXT_INDEX;
+
+ RPC_getPacket(nPacketSize, pPacket);
+ RPC_initPacket(pPacket, pOmxPacket, pData, nFxnIdx, nPacketSize);
+
+ /*No buffer mapping required */
+ RPC_SETFIELDVALUE(pData, nPos, RPC_OMX_MAP_INFO_NONE,
+ RPC_OMX_MAP_INFO_TYPE);
+ RPC_SETFIELDVALUE(pData, nPos, nOffset, OMX_U32);
+
+ RPC_SETFIELDVALUE(pData, nPos, hComp, OMX_HANDLETYPE);
+ RPC_SETFIELDCOPYGEN(pData, nPos, cParameterName,
+ OMX_MAX_STRINGNAME_SIZE);
+
+ RPC_sendPacket_sync(hCtx, pPacket, nPacketSize, nFxnIdx, pRetPacket,
+ nSize);
+
+ *eCompReturn = (OMX_ERRORTYPE) (((struct omx_packet *) pRetPacket)->result);
+
+ if (*eCompReturn == OMX_ErrorNone)
+ {
+ pRetData = ((struct omx_packet *) pRetPacket)->data;
+ RPC_GETFIELDCOPYTYPE(pRetData, nPos, pIndexType,
+ OMX_INDEXTYPE);
+ }
+
+ EXIT:
+ if (pPacket)
+ RPC_freePacket(pPacket);
+ if (pRetPacket && *eCompReturn != OMX_ErrorHardware)
+ RPC_freePacket(pRetPacket);
+
+ return eRPCError;
+
+}
+
+/* ***************************** DATA APIs ******************************** */
+
+/* ===========================================================================*/
+/**
+ * @name RPC_AllocateBuffer()
+ * @brief Remote invocation stub for OMX_AllcateBuffer()
+ * @param size : Size of the incoming RCM message (parameter used in the RCM alloc call)
+ * @param *data : Pointer to the RCM message/buffer received
+ * @return RPC_OMX_ErrorNone = Successful
+ * @sa TBD
+ *
+ */
+/* ===========================================================================*/
+RPC_OMX_ERRORTYPE RPC_AllocateBuffer(OMX_HANDLETYPE hRPCCtx,
+ OMX_INOUT OMX_BUFFERHEADERTYPE ** ppBufferHdr, OMX_IN OMX_U32 nPortIndex,
+ OMX_U32 * pBufHeaderRemote, OMX_PTR pAppPrivate, OMX_U32 nSizeBytes,
+ OMX_ERRORTYPE * eCompReturn)
+{
+ RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
+ TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
+ TIMM_OSAL_PTR pPacket = NULL, pRetPacket = NULL, pData =
+ NULL, pRetData = NULL;
+ OMX_U32 nPacketSize = RPC_PACKET_SIZE;
+ RPC_OMX_FXN_IDX_TYPE nFxnIdx;
+ OMX_U32 nPos = 0, nSize = 0, nOffset = 0;
+ OMX_S32 status = 0;
+ RPC_OMX_CONTEXT *hCtx = hRPCCtx;
+ OMX_HANDLETYPE hComp = hCtx->hRemoteHandle;
+ OMX_TI_PLATFORMPRIVATE *pPlatformPrivate = NULL;
+ OMX_BUFFERHEADERTYPE *pBufferHdr = *ppBufferHdr;
+ struct omx_packet *pOmxPacket = NULL;
+
+ DOMX_ENTER("");
+
+ nFxnIdx = RPC_OMX_FXN_IDX_ALLOCATE_BUFFER;
+ RPC_getPacket(nPacketSize, pPacket);
+ RPC_initPacket(pPacket, pOmxPacket, pData, nFxnIdx, nPacketSize);
+
+ /*No buffer mapping required */
+ RPC_SETFIELDVALUE(pData, nPos, RPC_OMX_MAP_INFO_NONE,
+ RPC_OMX_MAP_INFO_TYPE);
+ RPC_SETFIELDVALUE(pData, nPos, nOffset, OMX_U32);
+
+ RPC_SETFIELDVALUE(pData, nPos, hComp, OMX_HANDLETYPE);
+ RPC_SETFIELDVALUE(pData, nPos, nPortIndex, OMX_U32);
+ RPC_SETFIELDVALUE(pData, nPos, pAppPrivate, OMX_PTR);
+ RPC_SETFIELDVALUE(pData, nPos, nSizeBytes, OMX_U32);
+
+ RPC_sendPacket_sync(hCtx, pPacket, nPacketSize, nFxnIdx, pRetPacket,
+ nSize);
+
+ *eCompReturn = (OMX_ERRORTYPE) (((struct omx_packet *) pRetPacket)->result);
+
+ if (*eCompReturn == OMX_ErrorNone)
+ {
+ pRetData = ((struct omx_packet *) pRetPacket)->data;
+ RPC_GETFIELDVALUE(pRetData, nPos, *pBufHeaderRemote, OMX_U32);
+ //save platform private before overwriting
+ pPlatformPrivate = (*ppBufferHdr)->pPlatformPrivate;
+ //RPC_GETFIELDCOPYTYPE(pData, nPos, pBufferHdr, OMX_BUFFERHEADERTYPE);
+ /*Copying each field of the header separately due to padding issues in
+ the buffer header structure */
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->nSize, OMX_U32);
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->nVersion,
+ OMX_VERSIONTYPE);
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->pBuffer,
+ OMX_U8 *);
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->nAllocLen,
+ OMX_U32);
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->nFilledLen,
+ OMX_U32);
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->nOffset,
+ OMX_U32);
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->pAppPrivate,
+ OMX_PTR);
+ RPC_GETFIELDVALUE(pRetData, nPos,
+ pBufferHdr->pPlatformPrivate, OMX_PTR);
+ RPC_GETFIELDVALUE(pRetData, nPos,
+ pBufferHdr->pInputPortPrivate, OMX_PTR);
+ RPC_GETFIELDVALUE(pRetData, nPos,
+ pBufferHdr->pOutputPortPrivate, OMX_PTR);
+ RPC_GETFIELDVALUE(pRetData, nPos,
+ pBufferHdr->hMarkTargetComponent, OMX_HANDLETYPE);
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->pMarkData,
+ OMX_PTR);
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->nTickCount,
+ OMX_U32);
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->nTimeStamp,
+ OMX_TICKS);
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->nFlags,
+ OMX_U32);
+ RPC_GETFIELDVALUE(pRetData, nPos,
+ pBufferHdr->nInputPortIndex, OMX_U32);
+ RPC_GETFIELDVALUE(pRetData, nPos,
+ pBufferHdr->nOutputPortIndex, OMX_U32);
+
+ (*ppBufferHdr)->pPlatformPrivate = pPlatformPrivate;
+
+#ifdef TILER_BUFF
+ DOMX_DEBUG(" Copying plat pvt. ");
+ //if (offset != 0)
+ {
+ RPC_GETFIELDCOPYTYPE(pRetData, nPos,
+ (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
+
+ } else
+ {
+ //DOMX_DEBUG("OMX Error received: 0x%x",
+ // pRPCMsg->msgHeader.nOMXReturn);
+ }
+
+ EXIT:
+ if (pPacket)
+ RPC_freePacket(pPacket);
+ if (pRetPacket && *eCompReturn != OMX_ErrorHardware)
+ RPC_freePacket(pRetPacket);
+
+ DOMX_EXIT("");
+ return eRPCError;
+}
+
+/* ===========================================================================*/
+/**
+ * @name RPC_UseBuffer()
+ * @brief Remote invocation stub for OMX_AllcateBuffer()
+ * @param hComp: This is the handle on the Remote core, the proxy will replace
+ it's handle with actual OMX Component handle that recides on the specified core
+ * @param ppBufferHdr:
+ * @param nPortIndex:
+ * @param pAppPrivate:
+ * @param eCompReturn: This is return value that will be supplied by Proxy to the caller.
+ * This is actual return value returned by the Remote component
+ * @return RPC_OMX_ErrorNone = Successful
+ * @sa TBD
+ *
+ */
+/* ===========================================================================*/
+RPC_OMX_ERRORTYPE RPC_UseBuffer(OMX_HANDLETYPE hRPCCtx,
+ OMX_INOUT OMX_BUFFERHEADERTYPE ** ppBufferHdr, OMX_U32 nPortIndex,
+ OMX_PTR pAppPrivate, OMX_U32 nSizeBytes, OMX_U8 * pBuffer,
+ OMX_U32 * pBufHeaderRemote, OMX_ERRORTYPE * eCompReturn)
+{
+
+ RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
+ TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
+ TIMM_OSAL_PTR pPacket = NULL, pRetPacket = NULL, pData =
+ NULL, pRetData = NULL;
+ OMX_U32 nPacketSize = RPC_PACKET_SIZE;
+ RPC_OMX_FXN_IDX_TYPE nFxnIdx;
+ OMX_U32 nPos = 0, nSize = 0, nOffset = 0;
+ OMX_S32 status = 0;
+ RPC_OMX_CONTEXT *hCtx = hRPCCtx;
+ OMX_HANDLETYPE hComp = hCtx->hRemoteHandle;
+ OMX_TI_PLATFORMPRIVATE *pPlatformPrivate = NULL;
+ OMX_BUFFERHEADERTYPE *pBufferHdr = *ppBufferHdr;
+ struct omx_packet *pOmxPacket = NULL;
+ RPC_OMX_MAP_INFO_TYPE eMapInfo = RPC_OMX_MAP_INFO_NONE;
+ OMX_PTR pMetaDataBuffer = NULL;
+ OMX_U32 a =32;
+
+ DOMX_ENTER("");
+
+ nFxnIdx = RPC_OMX_FXN_IDX_USE_BUFFER;
+ RPC_getPacket(nPacketSize, pPacket);
+ RPC_initPacket(pPacket, pOmxPacket, pData, nFxnIdx, nPacketSize);
+
+ DOMX_DEBUG("Marshaling data");
+ /*Buffer mapping required */
+ eMapInfo = RPC_OMX_MAP_INFO_ONE_BUF;
+ if (((OMX_TI_PLATFORMPRIVATE *) pBufferHdr->pPlatformPrivate)->
+ pAuxBuf1 != NULL)
+ eMapInfo = RPC_OMX_MAP_INFO_TWO_BUF;
+ if (((OMX_TI_PLATFORMPRIVATE *)pBufferHdr->pPlatformPrivate)->
+ pMetaDataBuffer != NULL)
+ eMapInfo = RPC_OMX_MAP_INFO_THREE_BUF;
+
+ /*Offset is the location of the buffer pointer from the start of the data packet */
+ nOffset =
+ sizeof(RPC_OMX_MAP_INFO_TYPE) + sizeof(OMX_U32) +
+ sizeof(OMX_HANDLETYPE) + sizeof(OMX_U32) + sizeof(OMX_PTR) +
+ sizeof(OMX_U32);
+ RPC_SETFIELDVALUE(pData, nPos, eMapInfo, RPC_OMX_MAP_INFO_TYPE);
+ RPC_SETFIELDVALUE(pData, nPos, nOffset, OMX_U32);
+
+ RPC_SETFIELDVALUE(pData, nPos, hComp, OMX_HANDLETYPE);
+ RPC_SETFIELDVALUE(pData, nPos, nPortIndex, OMX_U32);
+ RPC_SETFIELDVALUE(pData, nPos, pAppPrivate, OMX_PTR);
+ RPC_SETFIELDVALUE(pData, nPos, nSizeBytes, OMX_U32);
+
+ RPC_SETFIELDVALUE(pData, nPos, pBuffer, OMX_U32);
+ DOMX_DEBUG("eMapInfo = %x",eMapInfo);
+ if (eMapInfo >= RPC_OMX_MAP_INFO_TWO_BUF)
+ {
+ RPC_SETFIELDVALUE(pData, nPos,
+ ((OMX_TI_PLATFORMPRIVATE *) pBufferHdr->
+ pPlatformPrivate)->pAuxBuf1, OMX_U32);
+ DOMX_DEBUG("UV buffer fd= %d",((OMX_TI_PLATFORMPRIVATE *)pBufferHdr->pPlatformPrivate)->pAuxBuf1);
+ }
+
+ if (eMapInfo >= RPC_OMX_MAP_INFO_THREE_BUF)
+ {
+ RPC_SETFIELDVALUE(pData, nPos,
+ ((OMX_TI_PLATFORMPRIVATE *) pBufferHdr->
+ pPlatformPrivate)->pMetaDataBuffer, OMX_U32);
+ DOMX_DEBUG("Metadata buffer = %d",((OMX_TI_PLATFORMPRIVATE *)pBufferHdr->pPlatformPrivate)->pMetaDataBuffer);
+ }
+
+ DOMX_DEBUG("About to send packet");
+ RPC_sendPacket_sync(hCtx, pPacket, nPacketSize, nFxnIdx, pRetPacket,
+ nSize);
+ DOMX_DEBUG("Remote call returned");
+
+ *eCompReturn = (OMX_ERRORTYPE) (((struct omx_packet *) pRetPacket)->result);
+
+ if (*eCompReturn == OMX_ErrorNone)
+ {
+ pRetData = ((struct omx_packet *) pRetPacket)->data;
+ RPC_GETFIELDVALUE(pRetData, nPos, *pBufHeaderRemote, OMX_U32);
+ //save platform private before overwriting
+ pPlatformPrivate = (*ppBufferHdr)->pPlatformPrivate;
+
+ /*Copying each field of the header separately due to padding issues in
+ the buffer header structure */
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->nSize, OMX_U32);
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->nVersion,
+ OMX_VERSIONTYPE);
+ /*
+ Do not expect buffer pointer - local buffer pointer is already
+ present in the local header.
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->pBuffer,
+ OMX_U8 *);
+ */
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->nAllocLen,
+ OMX_U32);
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->nFilledLen,
+ OMX_U32);
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->nOffset,
+ OMX_U32);
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->pAppPrivate,
+ OMX_PTR);
+ //Do not expect PlatformPrivate from Ducati
+ //RPC_GETFIELDVALUE(pRetData, nPos,pBufferHdr->pPlatformPrivate, OMX_PTR);
+ RPC_GETFIELDVALUE(pRetData, nPos,
+ pBufferHdr->pInputPortPrivate, OMX_PTR);
+ RPC_GETFIELDVALUE(pRetData, nPos,
+ pBufferHdr->pOutputPortPrivate, OMX_PTR);
+ RPC_GETFIELDVALUE(pRetData, nPos,
+ pBufferHdr->hMarkTargetComponent, OMX_HANDLETYPE);
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->pMarkData,
+ OMX_PTR);
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->nTickCount,
+ OMX_U32);
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->nTimeStamp,
+ OMX_TICKS);
+ RPC_GETFIELDVALUE(pRetData, nPos, pBufferHdr->nFlags,
+ OMX_U32);
+ RPC_GETFIELDVALUE(pRetData, nPos,
+ pBufferHdr->nInputPortIndex, OMX_U32);
+ RPC_GETFIELDVALUE(pRetData, nPos,
+ pBufferHdr->nOutputPortIndex, OMX_U32);
+
+ //Do not expect PlatformPrivate from Ducati
+ /*
+ (*ppBufferHdr)->pPlatformPrivate = pPlatformPrivate;
+
+ DOMX_DEBUG(" Copying plat pvt. ");
+ RPC_GETFIELDCOPYTYPE(pRetData, nPos,
+ (OMX_TI_PLATFORMPRIVATE *) ((*ppBufferHdr)->
+ pPlatformPrivate), OMX_TI_PLATFORMPRIVATE);*/
+
+ /*Resetting size as it might be diff on Ducati due to padding issues */
+ pBufferHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE);
+ }
+
+ EXIT:
+ if (pPacket)
+ RPC_freePacket(pPacket);
+ if (pRetPacket && *eCompReturn != OMX_ErrorHardware)
+ RPC_freePacket(pRetPacket);
+
+ DOMX_EXIT("");
+ return eRPCError;
+}
+
+/* ===========================================================================*/
+/**
+ * @name RPC_FreeBuffer()
+ * @brief Remote invocation stub for OMX_AllcateBuffer()
+ * @param size : Size of the incoming RCM message (parameter used in the RCM alloc call)
+ * @param *data : Pointer to the RCM message/buffer received
+ * @return RPC_OMX_ErrorNone = Successful
+ * @sa TBD
+ *
+ */
+/* ===========================================================================*/
+RPC_OMX_ERRORTYPE RPC_FreeBuffer(OMX_HANDLETYPE hRPCCtx,
+ OMX_IN OMX_U32 nPortIndex, OMX_IN OMX_U32 BufHdrRemote, OMX_U32 pBuffer,
+ OMX_ERRORTYPE * eCompReturn)
+{
+ RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
+ TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
+ TIMM_OSAL_PTR pPacket = NULL, pRetPacket = NULL, pData = NULL;
+ OMX_U32 nPacketSize = RPC_PACKET_SIZE;
+ RPC_OMX_FXN_IDX_TYPE nFxnIdx;
+ OMX_U32 nPos = 0, nSize = 0, nOffset = 0;
+ OMX_S32 status = 0;
+ RPC_OMX_CONTEXT *hCtx = hRPCCtx;
+ OMX_HANDLETYPE hComp = hCtx->hRemoteHandle;
+ struct omx_packet *pOmxPacket = NULL;
+
+ DOMX_ENTER("");
+
+ nFxnIdx = RPC_OMX_FXN_IDX_FREE_BUFFER;
+ RPC_getPacket(nPacketSize, pPacket);
+ RPC_initPacket(pPacket, pOmxPacket, pData, nFxnIdx, nPacketSize);
+
+ /*Offset is the location of the buffer pointer from the start of the data packet */
+ nOffset = sizeof(RPC_OMX_MAP_INFO_TYPE) + sizeof(OMX_U32) +
+ sizeof(OMX_HANDLETYPE) + sizeof(OMX_U32) + sizeof(OMX_U32);
+ /*No buffer mapping required */
+ RPC_SETFIELDVALUE(pData, nPos, RPC_OMX_MAP_INFO_ONE_BUF,
+ RPC_OMX_MAP_INFO_TYPE);
+ RPC_SETFIELDVALUE(pData, nPos, nOffset, OMX_U32);
+
+ RPC_SETFIELDVALUE(pData, nPos, hComp, OMX_HANDLETYPE);
+ RPC_SETFIELDVALUE(pData, nPos, nPortIndex, OMX_U32);
+ RPC_SETFIELDVALUE(pData, nPos, BufHdrRemote, OMX_U32);
+ /* Buffer is being sent separately only to catch NULL buffer errors
+ in PA mode */
+ RPC_SETFIELDVALUE(pData, nPos, pBuffer, OMX_U32);
+
+ RPC_sendPacket_sync(hCtx, pPacket, nPacketSize, nFxnIdx, pRetPacket,
+ nSize);
+
+ *eCompReturn = (OMX_ERRORTYPE) (((struct omx_packet *) pRetPacket)->result);
+
+ EXIT:
+ if (pPacket)
+ RPC_freePacket(pPacket);
+ if (pRetPacket && *eCompReturn != OMX_ErrorHardware)
+ RPC_freePacket(pRetPacket);
+
+ DOMX_EXIT("");
+ return eRPCError;
+}
+
+
+/* ===========================================================================*/
+/**
+ * @name RPC_EmptyThisBuffer()
+ * @brief
+ * @param size : Size of the incoming RCM message (parameter used in the RCM alloc call)
+ * @param *data : Pointer to the RCM message/buffer received
+ * @return RPC_OMX_ErrorNone = Successful
+ * @sa TBD
+ *
+ */
+/* ===========================================================================*/
+
+RPC_OMX_ERRORTYPE RPC_EmptyThisBuffer(OMX_HANDLETYPE hRPCCtx,
+ OMX_BUFFERHEADERTYPE * pBufferHdr, OMX_U32 BufHdrRemote,
+ OMX_ERRORTYPE * eCompReturn, OMX_BOOL bMapBuffer)
+{
+ RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
+ TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
+ OMX_U32 nPacketSize = RPC_PACKET_SIZE;
+ RPC_OMX_FXN_IDX_TYPE nFxnIdx;
+ OMX_U32 nPos = 0, nSize = 0, nOffset = 0;
+ OMX_S32 status = 0;
+ RPC_OMX_CONTEXT *hCtx = hRPCCtx;
+ OMX_HANDLETYPE hComp = hCtx->hRemoteHandle;
+ OMX_U8 *pAuxBuf1 = NULL;
+ struct omx_packet *pOmxPacket = NULL;
+ RPC_OMX_MAP_INFO_TYPE eMapInfo = RPC_OMX_MAP_INFO_NONE;
+#ifdef RPC_SYNC_MODE
+ TIMM_OSAL_PTR pPacket = NULL, pRetPacket = NULL, pData = NULL;
+#endif
+
+ DOMX_ENTER("");
+
+ nFxnIdx = RPC_OMX_FXN_IDX_EMPTYTHISBUFFER;
+ RPC_getPacket(nPacketSize, pPacket);
+ RPC_initPacket(pPacket, pOmxPacket, pData, nFxnIdx, nPacketSize);
+
+ if(bMapBuffer == OMX_TRUE)
+ {
+ pAuxBuf1 = ((OMX_TI_PLATFORMPRIVATE *) pBufferHdr->pPlatformPrivate)->pAuxBuf1;
+ /*Buffer mapping required */
+ if (((OMX_TI_PLATFORMPRIVATE *) pBufferHdr->pPlatformPrivate)->pAuxBuf1 == NULL)
+ eMapInfo = RPC_OMX_MAP_INFO_ONE_BUF;
+ else
+ eMapInfo = RPC_OMX_MAP_INFO_TWO_BUF;
+ /*Offset is the location of the buffer pointer from the start of the data packet */
+ nOffset =
+ sizeof(RPC_OMX_MAP_INFO_TYPE) + sizeof(OMX_U32) +
+ sizeof(OMX_HANDLETYPE) + sizeof(OMX_BUFFERHEADERTYPE *) + 3*sizeof(OMX_U32) +
+ sizeof(OMX_TICKS) + sizeof(OMX_HANDLETYPE) + sizeof(OMX_PTR) + 3*sizeof(OMX_U32);
+ }
+
+ RPC_SETFIELDVALUE(pData, nPos, eMapInfo, RPC_OMX_MAP_INFO_TYPE);
+
+ RPC_SETFIELDVALUE(pData, nPos, nOffset, OMX_U32);
+
+ RPC_SETFIELDVALUE(pData, nPos, hComp, OMX_HANDLETYPE);
+ RPC_SETFIELDVALUE(pData, nPos,
+ (OMX_BUFFERHEADERTYPE *) BufHdrRemote, OMX_BUFFERHEADERTYPE *);
+
+ RPC_SETFIELDVALUE(pData, nPos, pBufferHdr->nFilledLen, OMX_U32);
+ RPC_SETFIELDVALUE(pData, nPos, pBufferHdr->nOffset, OMX_U32);
+ RPC_SETFIELDVALUE(pData, nPos, pBufferHdr->nFlags, OMX_U32);
+ RPC_SETFIELDVALUE(pData, nPos, pBufferHdr->nTimeStamp, OMX_TICKS);
+ RPC_SETFIELDVALUE(pData, nPos, pBufferHdr->hMarkTargetComponent,
+ OMX_HANDLETYPE);
+ RPC_SETFIELDVALUE(pData, nPos, pBufferHdr->pMarkData, OMX_PTR);
+ RPC_SETFIELDVALUE(pData, nPos, pBufferHdr->nAllocLen, OMX_U32);
+ RPC_SETFIELDVALUE(pData, nPos, pBufferHdr->nOutputPortIndex, OMX_U32);
+ RPC_SETFIELDVALUE(pData, nPos, pBufferHdr->nInputPortIndex, OMX_U32);
+
+ if(bMapBuffer == OMX_TRUE)
+ {
+ RPC_SETFIELDVALUE(pData, nPos, pBufferHdr->pBuffer, OMX_U32);
+ if (eMapInfo == RPC_OMX_MAP_INFO_TWO_BUF)
+ {
+ RPC_SETFIELDVALUE(pData, nPos,
+ ((OMX_TI_PLATFORMPRIVATE *) pBufferHdr->pPlatformPrivate)->pAuxBuf1, OMX_U32);
+ }
+ }
+
+ DOMX_DEBUG(" pBufferHdr = %x BufHdrRemote %x", pBufferHdr,
+ BufHdrRemote);
+
+#ifdef RPC_SYNC_MODE
+ RPC_sendPacket_sync(hCtx, pPacket, nPacketSize, nFxnIdx, pRetPacket,
+ nSize);
+
+ *eCompReturn = (OMX_ERRORTYPE) (((struct omx_packet *) pRetPacket)->result);
+#else
+ RPC_sendPacket_async(hCtx->ClientHndl[RCM_DEFAULT_CLIENT], pPacket,
+ nFxnIdx);
+ RPC_checkAsyncErrors(hCtx->ClientHndl[RCM_DEFAULT_CLIENT], pPacket);
+
+ *eCompReturn = OMX_ErrorNone;
+#endif
+
+ EXIT:
+ if (pPacket)
+ RPC_freePacket(pPacket);
+ if (pRetPacket && *eCompReturn != OMX_ErrorHardware)
+ RPC_freePacket(pRetPacket);
+
+ DOMX_EXIT("");
+ return eRPCError;
+}
+
+
+/* ===========================================================================*/
+/**
+ * @name RPC_FillThisBuffer()
+ * @brief Remote invocation stub for OMX_AllcateBuffer()
+ * @param size : Size of the incoming RCM message (parameter used in the RCM alloc call)
+ * @param *data : Pointer to the RCM message/buffer received
+ * @return RPC_OMX_ErrorNone = Successful
+ * @sa TBD
+ *
+ */
+/* ===========================================================================*/
+RPC_OMX_ERRORTYPE RPC_FillThisBuffer(OMX_HANDLETYPE hRPCCtx,
+ OMX_BUFFERHEADERTYPE * pBufferHdr, OMX_U32 BufHdrRemote,
+ OMX_ERRORTYPE * eCompReturn)
+{
+ RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
+ TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
+ OMX_U32 nPacketSize = RPC_PACKET_SIZE;
+ RPC_OMX_FXN_IDX_TYPE nFxnIdx;
+ OMX_U32 nPos = 0, nSize = 0, nOffset = 0;
+ OMX_S32 status = 0;
+ RPC_OMX_CONTEXT *hCtx = hRPCCtx;
+ OMX_HANDLETYPE hComp = hCtx->hRemoteHandle;
+ OMX_U8 *pAuxBuf1 = NULL;
+ struct omx_packet *pOmxPacket = NULL;
+#ifdef RPC_SYNC_MODE
+ TIMM_OSAL_PTR pPacket = NULL, pRetPacket = NULL, pData = NULL;
+#endif
+
+ DOMX_ENTER("");
+
+ nFxnIdx = RPC_OMX_FXN_IDX_FILLTHISBUFFER;
+ RPC_getPacket(nPacketSize, pPacket);
+ RPC_initPacket(pPacket, pOmxPacket, pData, nFxnIdx, nPacketSize);
+
+ /*No buffer mapping required */
+ RPC_SETFIELDVALUE(pData, nPos, RPC_OMX_MAP_INFO_NONE,
+ RPC_OMX_MAP_INFO_TYPE);
+ RPC_SETFIELDVALUE(pData, nPos, nOffset, OMX_U32);
+
+ RPC_SETFIELDVALUE(pData, nPos, hComp, OMX_HANDLETYPE);
+ RPC_SETFIELDVALUE(pData, nPos,
+ (OMX_BUFFERHEADERTYPE *) BufHdrRemote, OMX_BUFFERHEADERTYPE *);
+
+ RPC_SETFIELDVALUE(pData, nPos, pBufferHdr->nFilledLen, OMX_U32);
+ RPC_SETFIELDVALUE(pData, nPos, pBufferHdr->nOffset, OMX_U32);
+ RPC_SETFIELDVALUE(pData, nPos, pBufferHdr->nFlags, OMX_U32);
+ RPC_SETFIELDVALUE(pData, nPos, pBufferHdr->nAllocLen, OMX_U32);
+ RPC_SETFIELDVALUE(pData, nPos, pBufferHdr->nOutputPortIndex, OMX_U32);
+ RPC_SETFIELDVALUE(pData, nPos, pBufferHdr->nInputPortIndex, OMX_U32);
+
+ DOMX_DEBUG(" pBufferHdr = %x BufHdrRemote %x", pBufferHdr,
+ BufHdrRemote);
+
+#ifdef RPC_SYNC_MODE
+ RPC_sendPacket_sync(hCtx, pPacket, nPacketSize, nFxnIdx, pRetPacket,
+ nSize);
+
+ *eCompReturn = (OMX_ERRORTYPE) (((struct omx_packet *) pRetPacket)->result);
+
+#else
+ RPC_sendPacket_async(hCtx->ClientHndl[RCM_DEFAULT_CLIENT], pPacket,
+ nFxnIdx);
+ RPC_checkAsyncErrors(hCtx->ClientHndl[RCM_DEFAULT_CLIENT], pPacket);
+
+ *eCompReturn = OMX_ErrorNone;
+#endif
+
+ EXIT:
+ if (pPacket)
+ RPC_freePacket(pPacket);
+ if (pRetPacket && *eCompReturn != OMX_ErrorHardware)
+ RPC_freePacket(pRetPacket);
+
+ DOMX_EXIT("");
+ return eRPCError;
+}
+
+
+/* ***************************** EMPTY APIs ******************************** */
+
+/* ===========================================================================*/
+/**
+ * @name EMPTY-STUB
+ * @brief
+ * @param
+ * @return
+ *
+ */
+/* ===========================================================================*/
+OMX_ERRORTYPE RPC_EventHandler(OMX_HANDLETYPE hRPCCtx, OMX_PTR pAppData,
+ OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2, OMX_PTR pEventData)
+{
+ return RPC_OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE RPC_EmptyBufferDone(OMX_HANDLETYPE hRPCCtx, OMX_PTR pAppData,
+ OMX_BUFFERHEADERTYPE * pBuffer)
+{
+ return RPC_OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE RPC_FillBufferDone(OMX_HANDLETYPE hRPCCtx, OMX_PTR pAppData,
+ OMX_BUFFERHEADERTYPE * pBuffer)
+{
+ return RPC_OMX_ErrorNone;
+}
+
+RPC_OMX_ERRORTYPE RPC_ComponentTunnelRequest(OMX_HANDLETYPE hRPCCtx,
+ OMX_IN OMX_U32 nPort, OMX_HANDLETYPE hTunneledRemoteHandle,
+ OMX_U32 nTunneledPort, OMX_INOUT OMX_TUNNELSETUPTYPE * pTunnelSetup,
+ OMX_ERRORTYPE * eCompReturn)
+{
+ RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
+ TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
+ OMX_U32 nPacketSize = RPC_PACKET_SIZE;
+ RPC_OMX_CONTEXT *hCtx = hRPCCtx;
+ OMX_HANDLETYPE hComp = hCtx->hRemoteHandle;
+ RPC_OMX_CONTEXT *hTunneledCtx = hTunneledRemoteHandle;
+ OMX_HANDLETYPE hTunneledComp = hTunneledCtx->hRemoteHandle;
+ RPC_OMX_FXN_IDX_TYPE nFxnIdx;
+ struct omx_packet *pOmxPacket = NULL;
+ OMX_U32 nPos = 0, nSize = 0, nOffset = 0;
+ OMX_S32 status = 0;
+#ifdef RPC_SYNC_MODE
+ TIMM_OSAL_PTR pPacket = NULL, pRetPacket = NULL, pData = NULL;
+#endif
+
+ printf(" Entering rpc:domx_stub.c:ComponentTunnelRequest\n");
+
+ nFxnIdx = RPC_OMX_FXN_IDX_COMP_TUNNEL_REQUEST;
+ RPC_getPacket(nPacketSize, pPacket);
+ RPC_initPacket(pPacket, pOmxPacket, pData, nFxnIdx, nPacketSize);
+
+ /*Pack the values into a packet*/
+ //Marshalled:[>ParentComp|>ParentPort|>TunnelComp|>TunneledPort>TunnelSetup]
+ RPC_SETFIELDVALUE(pData, nPos, RPC_OMX_MAP_INFO_NONE, RPC_OMX_MAP_INFO_TYPE);
+ RPC_SETFIELDVALUE(pData, nPos, hComp, OMX_HANDLETYPE);
+ RPC_SETFIELDVALUE(pData, nPos, nPort, OMX_U32);
+ RPC_SETFIELDVALUE(pData, nPos, hTunneledComp, OMX_HANDLETYPE);
+ RPC_SETFIELDVALUE(pData, nPos, nTunneledPort, OMX_U32);
+ printf("\n after RPC_sendPacket_sync");
+ RPC_sendPacket_sync(hCtx, pPacket, nPacketSize, nFxnIdx, pRetPacket,
+ nSize);
+
+ printf("\n after RPC_sendPacket_sync: *eCompReturn : 0x%x\n", (OMX_ERRORTYPE) (((struct omx_packet *) pRetPacket)->result));
+ *eCompReturn = (OMX_ERRORTYPE) (((struct omx_packet *) pRetPacket)->result);
+
+ EXIT:
+ if (pPacket)
+ RPC_freePacket(pPacket);
+ if (pRetPacket)
+ RPC_freePacket(pRetPacket);
+
+ DOMX_EXIT("");
+ return eRPCError;
+
+}